AssertJ和Mockito:检查一个稍微复杂的JTable事件?

时间:2016-10-11 14:36:06

标签: tdd mockito hamcrest jmock assertj

我正在完成这本书"通过测试引导的面向对象软件的发展和#34;。

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

我之前需要检查与JTable的第0行相关联的一个或多个表事件的发生。

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

(注意:几天前我被Mureinik here告知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)提取到经过验证的方法,以使其受到您想要的任何测试?

2 个答案:

答案 0 :(得分: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) );

更新:使用ArgumentMatcher表单Mockito。

ArgumentMatcher课程来自Mockito。

答案 1 :(得分: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();