Mockito-模拟遗留类构造函数 [英] Mockito - mocking legacy class constructor
问题描述
我正在为通过构造函数引用旧类的类编写JUnit.遗留类位于第三方jar中,因此我无法对其进行重构以使生活更轻松....
I am writing JUnit for a class that references a legacy class via constructor. The legacy class is in a third party jar, so I can't refactor it to make life easier....
这是正在测试的课程...
This is the class being tested...
public MyClass {
public String methodToTest(String param) {
LegacyClass legacy = new LegacyClass(param);
*..... etc ........*
}
}
这就是我要在模拟JUnit中执行的操作.
This is what I am trying to do in the 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.....*
}
}
关于如何执行此操作的任何想法?????
Any ideas on how I can do this ?????
推荐答案
为LegacyClass
创建 builder :
public class LegacyClassBuilder {
public LegacyClass build(String param) {
return new LegacyClass(param);
}
}
这样可以测试您的班级,以便它创建带有正确参数的LegacyClass
.
That way your class can be tested so it creates the LegacyClass
with correct parameter.
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
,则需要为MyClass
将使用的LegacyClass
创建非最终包装.
If LegacyClass
happens to be final
then you need to create non-final wrapper for LegacyClass
that MyClass
will use.
这篇关于Mockito-模拟遗留类构造函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!