java - Spock可以模拟Java构造函数吗

标签 java unit-testing groovy spock

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

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

“SolrZkClient”来自第三方 (Apache) Java 库。由于它尝试连接到 ZooKeeper,我想为此单元测试模拟它(而不是在内部运行一个作为单元测试的一部分)。

我的测试毫无困难地到达了构造函数,但我无法通过那个构造函数:

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

有什么办法吗?

最佳答案

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

关于java - Spock可以模拟Java构造函数吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21194523/

相关文章:

java - 无法验证用户是否是 Google Apps 中的管理员

java - 使用 7z 的 Commons 压缩给出的 Stream 不是 BZip2 格式

unit-testing - 我可以将用于测试的过滤器附加到 httpunit ServletRunner 吗?

c# - 使用命令式绑定(bind)时进行 Azure Functions 测试

javascript - 单元测试: Having trouble mocking a promise return to test my emit

Groovy - 将 XmlSlurper 与动态路径结合使用

html - 如何使用 HTTPBuilder 在 Groovy 中设置 GET-Response

java - 将curl与Runtime.getRuntime().exec一起使用

java - JNA 库和 native 库未找到错误

grails - 通过字符串将对象转换为特定类