我的测试类是这样的:
public class HandlerTest extends Specification {
Handler hander
EventBus eventBus=Mock()
def setup(){
handler=new Handler(eventBus)
}
def "constructor"(){
//How to verify two events do get added to eventBus?
}
}
和Handler的构造函数(它是一个java类)
public Handler(EventBus eventBus)
{
eventBus.add(FetchSearchWordsEvent.TYPE, this);
eventBus.add(SetSearchBoxTextEvent.TYPE, this);
}
问题是:
how to verify that two events do get registered?
答案 0 :(得分:3)
我会将对Handler构造函数的调用转移到测试本身,因为它是被测试的函数。
尝试以下方法:
public class HandlerTest extends Specification {
Handler hander
def mockEventBus = Mock(EventBus)
def "constructor"(){
when:
new Handler(mockEventBus)
then:
1 * mockEventBus.add(FetchSearchWordsEvent.TYPE, _ as Handler)
1 * mockEventBus.add(SetSearchBoxTextEvent.TYPE, _ as Handler)
}
}
应单独测试EventBus.add()的功能。
答案 1 :(得分:2)
这取决于registerHandler的实现方式,以及您想要验证的内容。如果目标是验证构造函数最终在eventBus上调用某些方法,则可以使用常规模拟。如果目标是验证构造函数是否自己调用registerHandler
,则可以使用Spy()
使用部分模拟,如Spock reference documentation中所述。
PS:请注意,部分嘲弄被视为气味。通常最好更改被测试的类以使其更容易测试。例如,您可以添加一个允许查询已注册哪些处理程序的方法。那你就不需要嘲笑了。