[英]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.