【发布时间】:2017-12-05 17:16:18
【问题描述】:
我有一个班级,我正在尝试进行单元测试。这个类扩展了另一个我目前对单元测试不感兴趣的类。
以下代码是我要测试的代码的过度简化。
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 受到保护并且在另一个包中。在最坏的情况下,我可以将所有测试都放在那个包中,但这使得跟踪代码变得很困难。
【问题讨论】:
-
这是一个支持组合而不是继承的有力案例,因为能够注入
getApi将使测试更容易。 -
@Makoto 我同意。但是..这在这个时候没有帮助。在这个项目中,我的任务只是编写测试。我们不能都拯救世界并以应有的方式重写事物。
-
我不同意。使您的代码可测试是测试的一部分。就目前而言,模拟这将是难以置信困难,因为它依赖于您正在测试的实例的部分模拟,而对于
final字段......那就更糟了。你会想吸引任何负责测试的人,让你更容易测试,这应该不是很困难。 -
查看我更新的答案,Easymock 支持部分模拟。
标签: java unit-testing junit mockito easymock