EasyMock: java.яз..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
Любое понимание этого было бы очень ценно.
Спасибо, Анна
4 ответа:
Я еще не присмотрелся тщательно, но это выглядит подозрительно:
String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());
anyObject()
это совпадение, и вы называете его после повтора. Он не используется для производства каких-либо объектов. Он используется для указания EasyMock разрешитьлюбой объект. EasyMock обнаруживает это дополнительное совпадение, но оно не вредно до второго теста. В этот момент число сопоставителей, которые EasyMock записал, но еще не использовал (2), не соответствует числу параметров, ожидаемых для второйdoXthing
Вызов (1).Вы должны передавать реальные параметры в
testCallingXthing
(или макет, который находится в режиме воспроизведения). Попробуйте передатьnull
напрямую или реальное значение, например2
.
Для меня эта неудача (в моем случае ожидалось 2 совпадения, записано 4.) означало: "вы смешиваете easymock и mockito в одном модульном тесте, поэтому случайно вызываете метод easymock notNull() для аргумента mockito. Что приводит к сбою, но только если тесты выполняются в определенном порядке.
Попробуйте:
String testResult = mainThing.testCallingXthing(eq(EasyMock.anyLong()));
Есть более утонченные сопоставители, чем
anyObject()
. Они позволяют создавать утверждения о сотрудниках на основе типов.Из документации EasyMock:
eq(X value)
Соответствует, если фактическое значение равно ожидаемому значению. Доступно для всех типов примитивов и объектов.anyBoolean()
,anyByte()
,anyChar()
,anyDouble()
,anyFloat()
,anyInt()
,anyLong()
,anyObject()
,anyShort()