是否可以使用JMockit的Deencapsulation API来交换方法实现?

时间:2015-03-02 05:13:44

标签: java jmockit

所以,基本上,有一些我无法改变的糟糕代码需要进行测试。传统上,你注入了你的模拟依赖项,但是使用这段代码,我不能这样做,因为没有setter方法。更糟糕的是,我需要测试的函数调用一堆静态工厂方法 - 我不能只使用MockUp策略来交换那里的实现,因为根本没有要注入的类实例。

在C / ++中,您可以检索指向函数的指针,并通过它的签名知道它的类型。如果你改变了指针,那么你可能会改变编译器构建堆栈的方式,你可以传递函数和所有Jazz。

有没有办法使用Deencapsulation API来替换静态方法实现?使用这个,我可以编写自己的类,从传统类中继承,但返回模拟对象以便仍然可以实现依赖注入?

public class TestedClass {
    public static void testedMethod() {
        UnMockableType instanceVariable = 
           UnInjectableFactory.staticFactoryConstructor();
        instanceVariable.preventControlFlowInfluenceThroughMocking();
    }
}

1 个答案:

答案 0 :(得分:1)

足够简单:

@Test
public void exampleTestUsingAMockUp()
{
    new MockUp<UnMockableType>() {
        @Mock
        void preventControlFlowInfluenceThroughMocking() {}
    };

    TestedClass.testedMethod();
}

上面,UnInjectableFactory没有被模拟,因为它不需要(假设它只是实例化/恢复UnMockableType)。

也可以使用@Mocked和Expectations API。

相关问题