AssertJ и Mockito: проверьте немного сложное событие JTable?

Я работаю над книгой «Развитие объектно-ориентированного программного обеспечения, управляемого тестами».

Но я использую AssertJ и Mockito вместо Hamcrest и jMock.

Раньше мне нужно было проверять наличие одного или нескольких событий таблицы, связанных со строкой 0 таблицы JTable.

    // verify that one or more events in row 0 happen
    verify(listener, atLeastOnce() ).tableChanged(refEq(new TableModelEvent(model, 0)));

(Примечание: Мурейник любезно проинформировал меня о refEq здесь несколько дней назад).

Теперь мне нужно проверить, что ровно один TableModelEvent встречается в строке 0 типа TableModelEvent.UPDATE. В книге есть:

one( listener ).tableChanged( with( aChangeInRow( 0 )));

... aChangeInRow, похоже, исходит от jMock.

NB TableModelEvent имеет полезный метод getType(). Вот что я хочу написать:

    // verify that precisely one ***change*** event happens in row 0
    // *** CAVEAT: ERRONEOUS CODE ***
    verify( listener ).tableChanged(refEq(new TableModelEvent(model, 0))).getType().isEqualTo( TableModelEvent.UPDATE );

но это даже не компилируется... что я должен был написать?

В более общем плане существует ли метод AssertJ/Mockito для извлечения значения, переданного в качестве параметра (здесь TableModelEvent) проверенному методу, чтобы подвергнуть его любым тестам, которые вы хотите?


person mike rodent    schedule 11.10.2016    source источник


Ответы (2)


Если вы не хотите использовать Hamcrest, вам придется написать свой собственный сопоставитель, проверяющий результат метода getType.

ArgumentMatcher<RockData> checkTypeMatcher = new ArgumentMatcher<TableModelEvent>() {


public boolean matches(Object arg0) {   
    //put more logic here
    TableModelEvent event = (TableModelEvent) arg0; 
    return event.getType() == TableModelEvent.UPDATE;
}
};

verify( listener ).tableChanged(Mockito.argThat(checkTypeMatcher) );

ОБНОВЛЕНИЕ: использование ArgumentMatcher формы Mockito.

Класс ArgumentMatcher взят из Mockito.

person Dominik Kunicki    schedule 15.10.2016
comment
Спасибо... но (если я не ошибаюсь) Matcher и BaseMatcher действительно являются классами Hamcrest. Возможно, решения без Hamcrest не существует (на данный момент я слишком новичок в тестировании, отсюда и вопрос), но я был бы весьма удивлен, если бы это было так... - person mike rodent; 18.10.2016
comment
Правильно, но вы можете использовать класс ArgumentMatcher из Mockito. Смотрите мое обновление выше. - person Dominik Kunicki; 18.10.2016
comment
Хорошо, спасибо... мне, однако, мне просто интересно, не может ли быть техника AssertJ, которая больше соответствует духу AssertJ? Что, на мой взгляд (как я уже сказал, я новичок) не связано с моей другой проблемой, которая заключается в том, что ваше решение также не проверяет номер строки, в которой произошло это обновление... Я просто думаю, что может быть решение, которое каким-то образом делает и то, и другое, возможно, путем объединения двух методов AssertJ. - person mike rodent; 18.10.2016

Mockito API работает с сопоставителями Hamcrest. Вам придется придерживаться их.

Я действительно не вижу смысла настаивать на сопоставлениях AssertJ, но если вы действительно хотите, вы можете захватить ArgumentCaptor, а затем использовать AssertJ.

ArgumentCaptor<TableModelEvent> cap = ArgumentCaptor.forClass(TableModelEvent.class);
verify(listener).tableChanged(cap.capture());

TableModelEvent value = cap.getValue();
assertThat(value).isNotNull();
person David Siro    schedule 14.11.2016
comment
Спасибо... Просто я, как новичок в тестировании, совсем запутался во всех этих разных фреймворках. Я прочитал несколько книг по TDD, и у меня появилось несколько моментов: во-первых, хорошая читабельность AssertJ, во-вторых, плавный (т. Hamcrest (например, JUnit связан с конкретным Hamcrest, когда вы используете Gradle)... но если мне нужно познакомиться с Hamcrest, пусть будет так! - person mike rodent; 15.11.2016
comment
Hamcrest, кажется, застопорился. Даже современные версии Mockito уже отделены от Hamcrest и не имеют его в качестве зависимости (хотя вы все равно можете использовать их вместе, если хотите). AssertJ все еще активно развивается и имеет множество удобных сопоставителей. - person Yoory N.; 18.09.2018