2016-10-11 24 views
1

Я работаю над книгой «Растущее объектно-ориентированное программное обеспечение, управляемое тестированием».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))); 

(NB я любезно сообщил о refEq по Mureinik here несколько дней назад).

Теперь мне нужно проверить, что ровно один 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 для извлечения значения, переданного в качестве параметра (здесь a TableModelEvent), к проверенному методу, чтобы подвергнуть его любым тестам, которые вы хотите?

ответ

0

Если вы не хотите использовать 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)); 

UPDATE: Использование ArgumentMatcher формы Mockito.

Класс ArgumentMatcher исходит от Mockito.

+0

Спасибо ... но (если я не понял), 'Matcher' и' BaseMatcher' действительно являются классами Hamcrest. Может быть, нет никакого решения без Хэмкреста (я слишком много тестировал newb на этом этапе, следовательно, вопрос), но я был бы очень удивлен, если бы так ... –

+0

Правильно, но вы можете использовать класс ArgumentMatcher из Mockito. См. Мое обновление выше. –

+0

ОК спасибо ... мне, однако, мне просто интересно, не может ли быть техника AssertJ, которая больше в «плавном» духе AssertJ? Который в моем сознании (как я говорю, я новичок) не связан с моей другой проблемой, а это то, что ваше решение не проверяет номер строки, где произошло это обновление ... Я просто думаю, что может быть решение, которое каким-то образом делает оба, возможно, путем «наложения» двух методов AssertJ. –

0

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(); 
+0

Спасибо ... Это просто, что я довольно смущен как тест newb со всеми этими разными фреймами. Я прочитал несколько книг по TDD, и появилось несколько моментов: сначала хорошая читаемость AssertJ, вторая - «плавная» (т. Е. Связанная ими) символ AssertJ-методов, а в-третьих, некоторые из сообщений о проблемах с конфликтующими версии Hamcrest (например,JUnit поставляется с конкретным Hamcrest, когда вы используете Gradle) ... но если мне нужно познакомиться с Hamcrest, пусть будет так! –

 Смежные вопросы

  • Нет связанных вопросов^_^