所以,基本上,有一些我无法更改的糟糕代码需要测试。传统上,您注入(inject)模拟的依赖项,但使用此代码,我无法这样做,因为没有 setter 方法。更糟糕的是,我需要测试的函数调用了一堆静态工厂方法 - 我不能只使用 MockUp 策略来交换那里的实现,因为根本没有要注入(inject)的类实例。
在 C/++ 中,您可以检索指向函数的指针并通过其签名了解其类型。如果您更改了指针,那么您可能会更改编译器构建堆栈的方式,并且您可以传递函数和所有 Jazz。
有没有办法使用 Deencapsulation API 来替换静态方法实现?使用这个,我可以编写自己的类,继承传统的类,但返回模拟对象,以便仍然实现依赖注入(inject)?
public class TestedClass {
public static void testedMethod() {
UnMockableType instanceVariable =
UnInjectableFactory.staticFactoryConstructor();
instanceVariable.preventControlFlowInfluenceThroughMocking();
}
}
最佳答案
很简单:
@Test
public void exampleTestUsingAMockUp()
{
new MockUp<UnMockableType>() {
@Mock
void preventControlFlowInfluenceThroughMocking() {}
};
TestedClass.testedMethod();
}
上面,UnInjectableFactory
没有被模拟,因为它不需要被模拟(假设它只是实例化/恢复 UnMockableType
)。
也可以使用 @Mocked
和 Expectations API 来完成。
关于java - 是否可以使用JMockit的Deencapsulation API来交换方法实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28803097/