我正在为通过构造函数引用旧类的类编写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/