如何在构造函数中测试逻辑?

时间:2014-03-06 02:55:51

标签: spock

我的测试类是这样的:

 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?

2 个答案:

答案 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:请注意,部分嘲弄被视为气味。通常最好更改被测试的类以使其更容易测试。例如,您可以添加一个允许查询已注册哪些处理程序的方法。那你就不需要嘲笑了。