我正在使用mockito进行单元测试。请考虑以下代码段
ThirdPartyClass tpo = mock(ThirdPartyClass.class);
doNothing().when(tpo).someMethod();
ThirdPartyClass
来自第三方jar,让我们说tp.jar
。现在tp.jar
不是一个超级罐子。这是ThirdPartyClass
的样子
class ThirdPartyClass
{
SomeOtherClass memberObject;
public ThirdPartyClass(){}
/*Rest of the code*/
}
现在,当我尝试运行单元测试时,java.lang.ClassNotFoundException
获得了SomeOtherClass
。请记住,tp.jar
不是一个超级jar,所以SomeOtherClass
不在我的类路径中是有意义的。
但为什么mockito无法处理这种传递依赖?有没有办法忽略所有传递依赖?
答案 0 :(得分:5)
"Only mock types that you own"是前往这里的方式。
其中一个原因正是您所描述的:测试设置变得过于复杂,例如:因为依赖。
因此,不是模拟ThirdPartyClass
,而是创建某种适配器,然后模拟该类。
interface ThirdPartyAdapter {
void someMethod(); // only put method here that you really use
}
然后嘲笑那件事:
ThirdPartyAdapter tpo = mock(ThirdPartyAdapter.class);
doNothing().when(tpo).someMethod();
在制作中,委托给ThirdPartyClass
:
class UsefulThing implements ThirdPartyAdapter {
ThirdPartyClass wrapped;
UsefulThing(ThirdPartyClass wrapped) {
this.wrapped = wrapped;
}
@Override
void someMethod() {
wrapped.someMethod()
}
}
优点:
我强烈推荐Growing Object Oriented Software by Freeman & Pryce - 或查看mockito docks以便快速入门。
答案 1 :(得分:4)
Mockito通过创建要模拟的类的子类来工作。所以要被模拟的类必须编译。也许可以通过将包含SomeOtherClass
的jar添加到范围为test
的依赖关系管理中来解决。
答案 2 :(得分:1)
如果你要模拟ThirdPartyClass
,那么SomeOtherClass
必须在你的编译时和运行时类路径上。如果没有看到你如何建立/运行它很难提供真正的帮助
您需要确保所有必需的类(jar)都在
如果您使用的是Show Console in Windows Application?或Gradle等构建工具来构建&然后运行类路径,包括传递依赖,将为您管理。如果您正在手动编译/运行,则需要确保传递依赖性在编译时和编译时。运行时类路径。