Spock 可以模拟 Java 构造函数吗 [英] Can Spock Mock a Java constructor
问题描述
试图扩大 Spock 在工作中的吸引力并遇到了这个问题.实际上试图为 Groovy 类编写单元测试,但需要调用 Java.静态方法调用私有构造函数.代码如下:
Trying to broaden the appeal of Spock at work and run into this issue. Actually trying to write Unit Tests for a Groovy class, but one that calls out to Java. A static method calls a private constructor. The code looks like:
private MyConfigurator(String zkConnectionString){
solrZkClient = new SolrZkClient(zkConnectionString, 30000, 30000,
new OnReconnect() {
@Override
public void command() { . . . }
});
}
SolrZkClient"来自第三方 (Apache) Java 库.由于它尝试连接到 ZooKeeper,我想为此单元测试模拟它(而不是在内部运行一个作为单元测试的一部分).
"SolrZkClient" is from third party (Apache) Java library. Since it tries to connect to ZooKeeper, I would like to mock that out for this Unit Test (rather than running one internally as part of the unit test).
我的测试毫无困难地到达构造函数,但我无法通过那个构造函数:
My test gets to the constructor without difficulty, but I can't get past that ctor:
def 'my test'() {
when:
MyConfigurator.staticMethodName('hostName:2181')
then:
// assertions
}
有没有办法做到这一点?
Is there anyway to do this?
推荐答案
由于被测类是用 Groovy 编写的,您应该能够通过全局 Groovy Mock/Stub/Spy 来模拟构造函数调用(请参阅 <Spock 参考文档).但是,更好的解决方案是将 MyConfigurator
类的实现解耦,以使其更易于测试.例如,您可以添加第二个构造函数和/或静态方法,以允许传递 SolrZkClient
的实例(或基本接口,如果有的话).然后你可以很容易地传入一个模拟.
Since the class under test is written in Groovy, you should be able to mock the constructor call by way of a global Groovy Mock/Stub/Spy (see Mocking Constructors in the Spock Reference Documentation). However, a better solution is to decouple the implementation of the MyConfigurator
class, in order to make it more testable. For example, you could add a second constructor and/or static method that allows to pass an instance of SolrZkClient
(or a base interface, if there is one). Then you can easily pass in a mock.
这篇关于Spock 可以模拟 Java 构造函数吗的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!