Dav*_*ave 8 java mocking mockito
我正在为一个通过构造函数引用遗留类的类编写JUnit.遗产类是在第三方罐子里,所以我不能重构它以使生活更轻松....
这是正在测试的课程......
public MyClass {
public String methodToTest(String param) {
LegacyClass legacy = new LegacyClass(param);
*..... etc ........*
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我想在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.....*
}
}
Run Code Online (Sandbox Code Playgroud)
关于如何做到这一点的任何想法?????
做一个建设者为LegacyClass:
public class LegacyClassBuilder {
public LegacyClass build(String param) {
return new LegacyClass(param);
}
}
Run Code Online (Sandbox Code Playgroud)
这样你的类就可以测试,所以它创建了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
}
}
Run Code Online (Sandbox Code Playgroud)
测试看起来像这样:
// 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);
Run Code Online (Sandbox Code Playgroud)
如果LegacyClass恰巧是final然后你需要创建非最终包装器LegacyClass是MyClass将使用.
小智 5
您可以使用PowerMockito框架:
import static org.powermock.api.mockito.PowerMockito.*;
whenNew(LegacyClass.class)
.withParameterTypes(String.class)
.withArguments(Matchers.any(String.class))
.thenReturn(new MockedLegacyClass(param));
Run Code Online (Sandbox Code Playgroud)
然后根据您的测试需求编写MockedLegacyClass实现.