Во время тестов комплекта EasyMock заявляет, что 0 matchers ожидал 1 зарегистрированный

Таким образом, я использовал расширение класса 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 на нем),

Так, какие-либо идеи?

16
задан holmes 19 February 2010 в 01:49
поделиться

3 ответа

У меня возникла аналогичная проблема. Из того, что я наблюдал, даже возвращаемые методы сопоставляются с помощью Matcher. Поэтому, если ваш первый метод не работает по какой-либо причине, сопоставитель для возвращаемого совпадения все еще находится в стеке. Это может быть одной из причин, по которой вы видите записанный 1 сопоставитель, даже если ваш метод не принимает никаких аргументов. По сути, первый вызов метода никогда не возвращал значения.

1
ответ дан 30 November 2019 в 22:10
поделиться

Какую версию Easymock вы используете?
Я читал сообщение о выпуске v.2.5.2, и в предыдущих версиях могла быть

тупая ошибка при захвате

попытаться использовать Easymock 2.5.2+

1
ответ дан 30 November 2019 в 22:10
поделиться

Хотя это правда, что это может быть ложное сообщение, возникшее из-за «глупой» ошибки 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 (), но я не проверял это экспериментально.

4
ответ дан 30 November 2019 в 22:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: