Подтвердить что ты не робот

EasyMock: java.lang.IllegalStateException: ожидается 1 совпадение, 2 записи

У меня проблема с EasyMock 2.5.2 и JUnit 4.8.2 (выполняется через Eclipse). Я прочитал все похожие записи здесь, но не нашел ответа. У меня есть класс, содержащий два теста, которые тестируют один и тот же метод. Я использую помощники.

  • Каждый тест проходит при запуске.
  • Первый тест всегда проходит - это верно, если я переключу порядок тестов в файле.

Вот упрощенная версия тестового кода:

private Xthing mockXthing;
private MainThing mainThing;

@Before
public void setUp() {
    mockXthing = EasyMock.createMock(Xthing.class);
    mainThing = new MainThing();
    mainThing.setxThing(mockXthing);
}

@After
public void cleanUp() {
    EasyMock.reset(mockXthing);
}

@Test
public void testTwo() {
    String abc = "abc";
    EasyMock.expect(mockXthing.doXthing((String) EasyMock.anyObject())).andReturn(abc);
    EasyMock.replay(mockXthing);
    String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());
    assertEquals("abc", testResult);
    EasyMock.verify(mockXthing);
}

@Test
public void testOne() {
    String xyz = "xyz";
    EasyMock.expect(mockXthing.doXthing((String) EasyMock.anyObject())).andReturn(xyz);
    EasyMock.replay(mockXthing);
    String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());
    assertEquals("xyz", testResult);
    EasyMock.verify(mockXthing);
}

Второй (или последний) тест всегда терпит неудачу со следующей ошибкой:

java.lang.IllegalStateException: 1 matchers expected, 2 recorded

Любое понимание этого было бы высоко оценено.

Спасибо, Энн

4b9b3361

Ответ 1

Я пока не смотрел до мелочей, но это выглядит подозрительно:

String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());

anyObject() является совпадением, и вы вызываете его после повтора. Он не используется для создания какого-либо объекта. Он использовал для указания EasyMock разрешить любой объект. EasyMock обнаруживает, что дополнительный матчи, но он не вреден до второго теста. В этот момент количество совпадений, которые EasyMock записал, но еще не использовал (2), не соответствует числу ожидаемых параметров для второго вызова doXthing (1).

Вы должны передавать параметры реального в testCallingXthing (или макет, который находится в режиме воспроизведения). Попробуйте перейти непосредственно к null или к реальному значению, например 2.

Ответ 2

для меня этот сбой (в моем случае ожидается 2 ответчика, 4 записанных.) означает "вы смешиваете easymock и mockito в том же unit test, поэтому случайно вызываете метод easymock notNull() для аргумента mockito. но только в том случае, если тесты выполняются в определенном порядке.

Ответ 3

Попробуйте:

String testResult = mainThing.testCallingXthing(eq(EasyMock.anyLong()));

Есть более изысканные матчи, чем anyObject(). Это позволяет вам делать утверждения на основе типов о коллабораторах.

Из Документация EasyMock:

eq(X value)
Соответствует, если фактическое значение равно ожидаемому значению. Доступно для всех примитивных типов и для объектов.
anyBoolean(), anyByte(), anyChar(), anyDouble(), anyFloat(), anyInt(), anyLong(), anyObject(), anyShort()

Ответ 4

Вы должны reset mock после каждого метода тестирования, чтобы избавиться от этой проблемы. Добавление ниже кода решит эту проблему.

@After 
public void after(){
    EasyMock.reset(mockXthing)
}