Mockito - 嘲弄遗留类构造函数

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)

关于如何做到这一点的任何想法?????

Spo*_*ike 8

做一个建设者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然后你需要创建非最终包装器LegacyClassMyClass将使用.


小智 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实现.