试图扩大 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/