1

我正在阅读“Growing Object-Oriented Software Guided by Tests”一书。

但我使用 AssertJ 和 Mockito 而不是 Hamcrest 和 jMock。

我以前需要检查与JTable.

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

(请注意refEq,几天前 Mureinik在这里向我介绍了这一点)。

现在我需要检查类型TableModelEvent的第 0 行是否恰好出现了一个TableModelEvent.UPDATE。本书有:

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

...aChangeInRow似乎来自 jMock。

NBTableModelEvent有一个有用的方法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)传递给已验证方法的值,以便对其进行任何您想要的测试?

4

2 回答 2

0

If you don't want to use Hamcrest You will have to write your own matcher veryfing the result of a getType method.

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: Using ArgumentMatcher form Mockito.

ArgumentMatcher class comes from Mockito.

于 2016-10-15T17:56:40.800 回答
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();
于 2016-11-14T22:46:27.997 回答