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
Любое понимание этого было бы высоко оценено.
Спасибо,
Энн
Ответы
Ответ 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)
}