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

标签 java jmockit

所以,基本上,有一些我无法更改的糟糕代码需要测试。传统上,您注入(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/

相关文章:

java - Maven 没有获取依赖关系

javascript - java mongodb中数组的聚合和匹配字段

java - Java 抛出自定义异常的函数

java - 如何针对不同情况从模拟方法返回多个值?

testing - Gradle-Jacoco-JMockit-测试正在挂起而未进行

java - 以节拍为单位循环运行 Java 应用程序

java.sql.SQLException : no such column with the value I'm trying to insert

unit-testing - 删除 JMockit 中先前定义的期望

java - Mockito/JMockit 和 Hamcrest 匹配器 : How to verify Lists/Collections?

java - Mockito:@Mock 对象何时初始化以及它调用哪个构造函数