可以Spock Mock一个Java构造函数

Joe*_*oeG 8 java groovy unit-testing spock

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

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

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

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

def 'my test'() {
    when:
        MyConfigurator.staticMethodName('hostName:2181')
    then:
        // assertions
}
Run Code Online (Sandbox Code Playgroud)

反正有没有这样做?

Pet*_*ser 10

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

  • 您可以使构造函数包为private,并添加注释(或`@ OnlyForTesting`注释).为了更好的可测试性,稍微打开一个类是很常见的. (3认同)