Таким образом, я использовал расширение класса EasyMock некоторое время теперь. Внезапно я получаю это исключение, но только когда я выполняю весь набор тестов:
java.lang.IllegalStateException: 0 matchers expected, 1 recorded.
at org.easymock.internal.ExpectedInvocation.createMissingMatchers(ExpectedInvocation.java:42)
at org.easymock.internal.ExpectedInvocation.<init>(ExpectedInvocation.java:34)
at org.easymock.internal.ExpectedInvocation.<init>(ExpectedInvocation.java:26)
at org.easymock.internal.RecordState.invoke(RecordState.java:64)
at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:24)
at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:56)
at org.easymock.classextension.internal.ClassProxyFactory$1.intercept(ClassProxyFactory.java:74)
at com.protrade.soccersim.data.emulator.matrix.PositionCategoryMatrix$$EnhancerByCGLIB$$c5298a7.getPossession(<generated>)
at com.protrade.soccersim.data.emulator.stats.team.PossessionCalculatorUnitTest.testDeterminePossessionHomeWin(PossessionCalculatorUnitTest.java:45)
Включенный код является этой маленькой красотой (обрезал немного):
@Before
public void setUp() throws Exception {
homeTeam = createMock( PositionCategoryMatrix.class );
awayTeam = createMock( PositionCategoryMatrix.class );
...
}
@Test
public void testDeterminePossessionHomeWin() {
expect(homeTeam.getPossession()).andReturn( 0.15151515 );
expect(awayTeam.getPossession()).andReturn( 0.01515152 );
replay( homeTeam, awayTeam );
...
}
Исключение выдается на первом, ожидают. И это действительно не имеет смысла. Это говорит, что получает matcher, но метод даже не берет аргумент. И достаточно нечетный это только во время наборов тестов! Я создаю новую насмешку в @Before, таким образом, он ничего не должен наследовать от где-то в другом месте (не, что некоторый другой метод будет иметь matcher на нем),
Так, какие-либо идеи?
У меня возникла аналогичная проблема. Из того, что я наблюдал, даже возвращаемые методы сопоставляются с помощью Matcher. Поэтому, если ваш первый метод не работает по какой-либо причине, сопоставитель для возвращаемого совпадения все еще находится в стеке. Это может быть одной из причин, по которой вы видите записанный 1 сопоставитель, даже если ваш метод не принимает никаких аргументов. По сути, первый вызов метода никогда не возвращал значения.
Какую версию Easymock вы используете?
Я читал сообщение о выпуске v.2.5.2, и в предыдущих версиях могла быть
тупая ошибка при захвате
попытаться использовать Easymock 2.5.2+
Хотя это правда, что это может быть ложное сообщение, возникшее из-за «глупой» ошибки EasyMock, это также очень вероятно из-за неправильного использования EasyMock API. В моем случае сообщение возникло из этого теста JUnit 3.8 (и, как и вы, это произошло только тогда, когда я запустил весь свой набор тестов, и только через Maven, а не Eclipse):
public void testSomething() {
// Set up
MyArgumentType mockArg = (MyArgumentType) EasyMock.anyObject(); // bad API usage
// Invoke the method under test
final String result = objectUnderTest.doSomething(mockArg);
// Verify (assertions, etc.)
...
}
Вместо использования anyObject () я должен был иметь использовал createMock (MyArgumentType.class) или один из его вариантов. Не знаю, о чем я думал, я написал миллионы этих тестов и правильно использовал API.
Немного сбивает с толку то, что тест, который не проходит с сообщением «неправильное количество сопоставителей», не обязательно (или когда-либо?) Тот, в котором вы неправильно использовали API. Это может быть первый тест, выполненный после ошибочного, который содержит метод replay () или verify (), но я не проверял это экспериментально.