当前位置: 首页 > 知识库问答 >
问题:

Spock能模拟Java构造函数吗

应志用
2023-03-14

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

反正有这样做的吗?

共有1个答案

颜文康
2023-03-14

由于测试中的类是用Groovy编写的,因此您应该能够通过全局Groovy mock/stub/spy来模拟构造函数调用(请参见Spock参考文档中的模拟构造函数)。但是,更好的解决方案是将MyConfigurator类的实现解耦,以使其更易测试。例如,您可以添加第二个构造函数和/或静态方法,以允许传递SolrzkClient的实例(或者基接口,如果有的话)。然后你可以很容易地通过模拟。

 类似资料:
  • 问题内容: 试图扩大Spock在工作中的吸引力并遇到此问题。实际上是试图为Groovy类编写单元测试,但是它调用了Java。静态方法调用私有构造函数。代码如下: “ SolrZkClient”来自第三方(Apache)Java库。由于它试图连接到ZooKeeper,因此我想对此单元测试进行模拟(而不是在单元测试的内部运行)。 我的测试毫不费力地进入了构造函数,但是我无法超越那个ctor: 反正有这

  • 问题内容: 我想将构造函数模拟为方法。 在我的测试中,我想做这样的事情: 但是给我这个 错误 知道为什么吗? 问题答案: 您可以使用PowerMock模拟构造函数。 如果由于某种原因而无法使用PowerMock,则最可行的解决方案是将工厂注入到包含此方法的任何类中。然后,您将使用工厂创建对象并模拟工厂。

  • 我正在为我的java类编写测试类。我将Junit5与Mockito一起使用。 我使用的Junit5与Power Mockito不兼容,所以我只使用Mockito。 我有,它具有下面这样的函数,并且在构造函数中初始化了。 当我编写测试用例时,我模拟了,但是由于我们在一个方法中创建,我如何模拟,这样我就可以编写期望值,根据我在测试类中设置的选择获得值?

  • 问题内容: 我的课如下: 在构造函数中的逻辑和是我试图嘲弄的事情。我想要任何调用:返回一个虚拟字符串。 我试过了: 但这似乎不起作用。仍在执行构造函数逻辑,而不是获取的模拟对象。 问题答案: 您发布的代码适用于最新版本的Mockito和Powermockito。也许您还没有准备A?试试这个: A.java MockA.java 两项测试均应通过Mockito 1.9.0,powermockito

  • 我试图从Spock测试中扩展GebSpec的类调用java构造函数。我有这样一个错误:“不允许构造函数;相反,定义一个'setup()'或'setup spec()'方法”。我需要打这样的电话: