试图扩大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
}
有没有这样做?
答案 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(){ }
标签块内部