Spock可以模拟一个Java构造函数 [英] Can Spock Mock a Java constructor

查看:292
本文介绍了Spock可以模拟一个Java构造函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

pre $ private私人MyConfigurator ,
new OnReconnect(){
@Override
public void command(){。。。}
});




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



我的测试毫无困难地到达了构造函数,但是我无法超越那个ctor:

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

有没有办法做到这一点?

rel =nofollow> Mocking Constructors 在 Spock参考文档)。然而,更好的解决方案是分离 MyConfigurator 类的实现,以使其更具可测性。例如,您可以添加第二个构造函数和/或静态方法,以允许传递 SolrZkClient (或基础接口,如果有的话)的实例。然后你可以轻松地通过模拟。


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" 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?

解决方案

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆