繁体   English   中英

使用 Powermock 在 Groovy 中创建模拟实例

[英]Mocking instance creation in Groovy with Powermock

我正在尝试使用 Powermock (1.7.0RC2)、Mockito2 (2.4.0) 和 TestNG (6.8.21) 通过 Groovy 类中的 new 运算符模拟实例创建。 但通常的方法不起作用。 这是我的课程和测试。

public class A {
    public String send() {
        B b = new B();
        return b.send();
    }
}    

public class B {       
    public String send() {
        return "SendFromOriginB";
    }
}

@PrepareForTest([A.class])
class TestConstructor extends PowerMockTestCase {
    @Mock
    private B bMock

    @Test
    void test() {
      A a = new A()

     given(bMock.send()).willReturn("Send from B mock")
     PowerMockito.whenNew(B.class).withNoArguments().thenReturn(bMock)
     assertEquals(a.send(), "Send from B mock")
    }
}

问题是 A 类是Groovy 类 而且似乎Powermock.whenNew不知道new B()正在调用。

因此, var b包含 B 类的常用实例,而不是模拟和测试失败。 但是,如果 A 类是Java 类,那么 test 会按我的预期工作并且var b包含我的mock Groovy 通过自己的方式创建实例,我无法正确模拟它们。

有没有人知道如何在 Groovy 类中模拟实例创建?

你明白 Groovy 不是 Java 吗? 是什么让您认为适用于 Java 语言的构造适用于其他语言?

从这个意义上说:您的第一步应该是使用javap检查由 Groovy 创建的类 A 的文件。看看里面有什么。

除此之外:用工厂替换new的并允许注入该工厂将使您可以轻松地进行测试,那时您甚至不需要 PowerMock。

我有两个建议!

使用@CompileStatic

@CompileStatic // <- you can use on class level
public class A {

    // Or you can use on method level 
    // depending on groovy version
    @CompileStatic
    public String send() {
        // 
    }
}

此注释将删除破坏 PowerMock.whenNew() 方法的元编程协议。

我的第二个建议是使用Spock 框架 该框架基于 BDD,当您使用 groovy 时,可以使您的测试代码非常干净和可读! Spock 也可以模拟构造函数

您在 spock 中的测试代码可能是这样的:

def "Given an class A, when B constructor returns a mock, a must use the mock"() {
    given:
    String sendFromBMock = "Send from B mock"
    and:
    bMock.send() >> sendFromBMock
    when:
    new B() >> bMock
    then:
    a.send() == sendFromBMock
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM