可以Spock Mock一个Java构造函数

时间:2014-01-17 19:44:20

标签: java unit-testing groovy spock

试图扩大Spock在工作中的吸引力并遇到这个问题。实际上尝试为Groovy类编写单元测试,但是要调用Java。静态方法调用私有构造函数。代码如下:

private MyConfigurator(String zkConnectionString){
    solrZkClient = new SolrZkClient(zkConnectionString, 30000, 30000,
            new OnReconnect() {
                @Override
                public void command() { . . . }
            });
}

“SolrZkClient”来自第三方(Apache)Java库。因为它试图连接到ZooKeeper,我想为这个单元测试嘲笑它(而不是在内部运行一个作为单元测试的一部分)。

我的测试毫无困难地进入构造函数,但是我无法通过那个ctor:

def 'my test'() {
    when:
        MyConfigurator.staticMethodName('hostName:2181')
    then:
        // assertions
}

有没有这样做?

3 个答案:

答案 0 :(得分:10)

由于测试中的类是用Groovy编写的,因此您应该能够通过全局Groovy Mock / Stub / Spy来模拟构造函数调用(请参阅Mocking Constructors中的Spock Reference Documentation)。但是,更好的解决方案是将MyConfigurator类的实现去耦,以使其更易于测试。例如,您可以添加第二个构造函数和/或静态方法,以允许传递SolrZkClient的实例(或基本接口,如果有的话)。然后你可以很容易地传入模拟。

答案 1 :(得分:1)

您可以使用GroovySpy在Spock中模拟构造函数

例如:

def 'my test'() {
 given: 
 def solrZkClient = GroovySpy(SolrZkClient.class,global: true);
 when:
    MyConfigurator.staticMethodName('hostName:2181')
 then:
    // assertions
}

答案 2 :(得分:0)

cd /you/working/jekyll
cp -R `echo "$(bundle info minima --path)/_*/"` .
cp -R `echo "$(bundle info minima --path)/assets/"` .

将其放入def def anySubscriber = GroovySpy(RealSubscriber, global: true) 1 * new RealSubscriber("Fred") 块中或setup(){ }标签块内部