是否可以使用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 来完成。