我有一个我试图单位测试的类。该课程扩展了我目前对单元测试不感兴趣的另一个课程。
以下代码是我要测试的代码的过度简化。
package com.example.somePackage;
public class ApiBase {
protected <T extends SomeClass> t getApi(Class<T> apiClass) {/* some logic*/}
}
package com.example.anotherPackage;
public MagicApiImpl extends ApiBase {
private final MagicApiHandler apiHandler = new MagicApiHandler();
public String doSomeStuff(String someString) {
final BookApi bookApi = getApi(BookApi.class);
// some logic
return apiHandler.someMethod(bookApi, someString);
}
}
我想在MagicApiImpl
上测试doSomeStuff()
,我想模拟的部分是getApi()
中回来的。
首先,我尝试简单地创建一个magicapiimpl的实例,并设置所有发生的幕后事物,但在我要测试的情况下开始变得过于复杂,以及我需要在其他情况下进行测试的次数课程。我将在其自己的测试中处理getApi()
中逻辑的测试。
使用EasyMock对此进行测试将很有帮助,因为这是该项目的大多数测试都编写的,但我不会过分地使用Mockito。
编辑
好吧,我正在阅读有关Mockito.spy()的信息,这本来是很棒的,但可悲的是,Getapi受到了保护,并在另一个包裹中受到保护。最糟糕的情况,我可以重新将所有测试放在该软件包中,但这使得它很难跟踪代码。
使用EasyMock部分模拟您的测试应该看起来像:
@Test
public void test() {
MagicApiImpl impl = EasyMock.createMockBuilder(MagicApiImpl.class)
.addMockedMethod("getApi")
.createMock();
EasyMock.expect(impl.getApi(BookApi.class)).andReturn(/**Wharever you need*/);
EasyMock.replay(impl);
String input = "INPUT";
String output = impl.doSomeStuff(input);
System.out.println("The OUTPUT is: " + output);
EasyMock.verify(impl);
//Run asserts here
}
参考:http://easymock.org/user-guide.html#mocking-partial