所以,基本上,有一些我无法改变的糟糕代码需要进行测试。传统上,你注入了你的模拟依赖项,但是使用这段代码,我不能这样做,因为没有setter方法。更糟糕的是,我需要测试的函数调用一堆静态工厂方法 - 我不能只使用MockUp策略来交换那里的实现,因为根本没有要注入的类实例。
在C / ++中,您可以检索指向函数的指针,并通过它的签名知道它的类型。如果你改变了指针,那么你可能会改变编译器构建堆栈的方式,你可以传递函数和所有Jazz。
有没有办法使用Deencapsulation API来替换静态方法实现?使用这个,我可以编写自己的类,从传统类中继承,但返回模拟对象以便仍然可以实现依赖注入?
public class TestedClass {
public static void testedMethod() {
UnMockableType instanceVariable =
UnInjectableFactory.staticFactoryConstructor();
instanceVariable.preventControlFlowInfluenceThroughMocking();
}
}
答案 0 :(得分:1)
足够简单:
@Test
public void exampleTestUsingAMockUp()
{
new MockUp<UnMockableType>() {
@Mock
void preventControlFlowInfluenceThroughMocking() {}
};
TestedClass.testedMethod();
}
上面,UnInjectableFactory
没有被模拟,因为它不需要(假设它只是实例化/恢复UnMockableType
)。
也可以使用@Mocked
和Expectations API。