我正在为通过构造函数引用旧类的类编写JUnit。遗留类位于第三方jar中,因此我无法对其进行重构以使生活更轻松...。

这是正在测试的类(class)...

public MyClass {

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

这就是我在模仿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制作一个构建器:

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/

10-10 06:15