是否可以使用JMockit的DeencapsulationAPI来交换方法实现?
Is it possible to use JMockit's Deencapsulation API to exchange method implementation?
所以,基本上,有一些我无法更改的糟糕代码需要测试。传统上,您注入模拟的依赖项,但使用这段代码,我不能这样做,因为没有 setter 方法。更糟糕的是,我需要测试的函数调用了一堆静态工厂方法——我不能只使用 MockUp 策略来换出那里的实现,因为根本没有要注入的 class 实例。
在 C/++ 中,您可以检索指向函数的指针,并通过它的签名知道它的类型。如果您更改了指针,那么您可能会更改编译器构建堆栈的方式,并且您可以传递函数和所有 Jazz。
有没有办法用DeencapsulationAPI来代替静态方法的实现?使用它,我可以编写自己的 class,继承传统的但 return 模拟对象以便仍然实现依赖注入?
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
没有被嘲笑,因为它不需要被嘲笑(假设它只是 instantiates/recovers 和 UnMockableType
)。
也可以用 @Mocked
和期望 API 来完成。
所以,基本上,有一些我无法更改的糟糕代码需要测试。传统上,您注入模拟的依赖项,但使用这段代码,我不能这样做,因为没有 setter 方法。更糟糕的是,我需要测试的函数调用了一堆静态工厂方法——我不能只使用 MockUp 策略来换出那里的实现,因为根本没有要注入的 class 实例。
在 C/++ 中,您可以检索指向函数的指针,并通过它的签名知道它的类型。如果您更改了指针,那么您可能会更改编译器构建堆栈的方式,并且您可以传递函数和所有 Jazz。
有没有办法用DeencapsulationAPI来代替静态方法的实现?使用它,我可以编写自己的 class,继承传统的但 return 模拟对象以便仍然实现依赖注入?
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
没有被嘲笑,因为它不需要被嘲笑(假设它只是 instantiates/recovers 和 UnMockableType
)。
也可以用 @Mocked
和期望 API 来完成。