java - Mockito - 模拟遗留类构造函数

标签 java mocking mockito

我正在为一个通过构造函数引用遗留类的类编写 JUnit。遗留类在第三方 jar 中,所以我无法重构它以使生活更轻松....

这是被测试的类...

public MyClass {

    public String methodToTest(String param) {
        LegacyClass legacy = new LegacyClass(param);
        *..... etc ........*
    }
}

这就是我在 mockito JUnit 中尝试做的事情。

public MyClassTest {

    @Test
    public void testMethodToTest() throws Exception {
        LegacyClass legacyMock = mock(LegacyClass.class);
        when(*the LegacyClass constructor with param is called*).thenReturn(legacyMock);
        *.... etc.....*
    }
}

关于如何执行此操作的任何想法?????

最佳答案

LegacyClass 创建一个 builder:

public class LegacyClassBuilder {

    public LegacyClass build(String param) {
        return new LegacyClass(param);
    }

}

这样就可以测试您的类,从而创建具有正确参数的 LegacyClass

public MyClass {

    private LegacyClassBuilder builder;

    public setBuilder(LegacyClassBuilder builder) {
        this.builder = builder;
    }

    public String methodToTest(String param) {
        LegacyClass legacy = this.builder.build(param);
        ... etc
    }
}

测试看起来像这样:

// ARRANGE
LegacyClassBuilder mockBuilder = mock(LegacyClassBuilder.class);
LegacyClass mockLegacy = mock(LegacyClass.class); 
when(mockBuilder.build(anyString()).thenReturn(mockLegacy);

MyClass sut = new MyClass();
sut.setBuilder(mockBuilder);
String expectedParam = "LOLCAT";


// ACT
sut.methodToTest(expectedParam);

// ASSERT
verify(mockBuilder).build(expectedParam);

如果 LegacyClass 恰好是 final 那么您需要为 LegacyClass 创建非最终包装器 MyClass会用。

关于java - Mockito - 模拟遗留类构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6288575/

相关文章:

java - 单元格渲染器和失去焦点

java - Maven 插件 - 如何要求许可证

OpenJ9 无法解析 java.util.Base64

java - 如何模拟下游方法调用?

c++ - 如何模拟依赖的成员变量?

java - Vaadin 将类(class)附加到页面?

java - 如何在 Java EE7 Rest 应用程序中启用身份验证/授权?获取 "Client not authorized for this invocation"

java - 为什么hang()方法只执行一次?

java - 使用mockito和powermocks注入(inject)模拟

junit - mockito 中的持续 stub 是什么以及我们在哪里使用它?