Записано больше совпадений, чем ожидалось - Easymock выходит из строя от Maven, а не от Eclipse - PullRequest
6 голосов
/ 14 апреля 2011

У меня странная проблема с Easymock 3.0 и JUnit 4.8.2. Проблема возникает только при выполнении тестов из Maven, а не из Eclipse.

Это модульный тест (очень простой):

...
protected ValueExtractorRetriever mockedRetriever;
...

@Before
public void before() {
    mockedRetriever = createStrictMock(ValueExtractorRetriever.class);
}

@After
public void after() {
    reset(mockedRetriever);
}

@Test
public void testNullValueExtractor() { 
    expect(mockedRetriever.retrieve("PROP")).andReturn(null).once();
    replay(mockedRetriever);

    ValueExtractor retriever = mockedRetriever.retrieve("PROP");
    assertNull(retriever);

    assertTrue(true);
}

И я получаю:

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

Странно то, что я даже не использую сопоставление аргументов. И это единственный метод теста! и что еще хуже, он работает от Eclipse и не работает от Maven!

Я нашел несколько ссылок, которые не дали мне ответа:

Если я изменю модульный тест и добавлю еще один метод (который использует сопоставление аргументов):

@Test
public void testIsBeforeDateOk() {
    expect(mockedRetriever.retrieve((String)anyObject())).andReturn(new PofExtractor()).anyTimes();
    replay(this.mockedRetriever);

    FilterBuilder fb = new FilterBuilder();
    assertNotNull(fb);

    CriteriaFilter cf = new CriteriaFilter();
    assertNotNull(cf);
    cf.getValues().add("2010-12-29T14:45:23");
    cf.setType(CriteriaType.DATE);
    cf.setClause(Clause.IS_BEFORE_THE_DATE);

    CriteriaQueryClause clause = CriteriaQueryClause.fromValue(cf.getClause());
    assertNotNull(clause);
    assertEquals(CriteriaQueryClause.IS_BEFORE_THE_DATE, clause);

    clause.buildFilter(fb, cf, mockedRetriever);
    assertNotNull(fb);

    Filter[] filters = fb.getFilters();
    assertNotNull(filters);
    assertEquals(filters.length, 1);

    verify(mockedRetriever);

    logger.info("OK");
}

этот последний метод проходит тест, но не другой. Как это возможно!?!?!

С уважением, Нико

Дополнительные ссылки:

"bartling.blogspot.com/2009/11/using-argument-matchers-in-easymock-and.html"

"www.springone2gx.com/blog/scott_leberknight/2008/09/the_n_matchers_expected_m_recorded_problem_in_easymock"

"stackoverflow.com/questions/4605997/3-matchers-expected-4-recorded"

Ответы [ 3 ]

5 голосов
/ 15 апреля 2011

У меня была очень похожая проблема, и я написал свои выводы по ссылке ниже. http://www.flyingtomoon.com/2011/04/unclosed-record-state-problem-in.html (только что обновлено)

Я считаю, что проблема в другом тесте влияет на ваш текущий тест. Проблема в другом тестовом классе, и это влияет на ваш тест. Чтобы найти место реальной проблемы, я советую отключить проблемные тесты один за другим, пока вы не сообщите о неудачном тесте.

На самом деле это то, что я сделал. Я поочередно отключал неуспешные тесты, пока не нашел проблемный тест. Я нашел тест, который выдает исключение и ловит аннотацию "@extected", не останавливая запись.

1 голос
/ 12 апреля 2017

У нас недавно возникла эта проблема, и она поднялась только тогда, когда мы запустили весь набор тестов (более 1100 тестов).В конце концов, я обнаружил, что могу поставить точку останова на взрывающемся тесте, а затем вернуться назад в список тестов, которые Eclipse уже выполнил, ища предыдущий тестовый пример, который неправильно настроил макет.

Наша проблема оказалась в том, что кто-то использовал EasyMock.anyString() вне оператора EasyMock.expect(...).Конечно же, было проведено два теста, прежде чем тот, который не удался.

По сути, произошло то, что неправильное использование сопоставителя вне оператора ожидаемого отравляло состояние EasyMock, и в следующий раз мы попыталисьчтобы создать макет, EasyMock взорвется.

0 голосов
/ 14 апреля 2011

Мне кажется, первое сообщение об ошибке

java.lang.IllegalStateException: 1 ожидаемых матчей, 2 записано.

означает, что ваши mockedRetriever методы вызываются дважды, но тест ожидает, что он был вызван один раз. Таким образом, конфигурация вашего Eclipse и Maven отличается.

И у меня нет причин сбрасывать макет после теста. Просто помните, что JUnit создает новый экземпляр класса для каждого метода тестирования.

РЕДАКТИРОВАНИЕ:

Как насчет причины, по которой последний метод испытаний прошел ответ:

expect(mockedRetriever.retrieve((String)anyObject())).andReturn(new PofExtractor()).anyTimes();

Но в вашем первом методе тестирования это:

expect(mockedRetriever.retrieve("PROP")).andReturn(null).once();

как эквивалент:

expect(mockedRetriever.retrieve("PROP")).andReturn(null);
...