我正在完成这本书"通过测试引导的面向对象软件的发展和#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
)提取到经过验证的方法,以使其受到您想要的任何测试?
答案 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();