Mockito:如何忽略传递依赖

时间:2018-03-07 14:51:31

标签: java junit mockito classnotfoundexception

我正在使用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无法处理这种传递依赖?有没有办法忽略所有传递依赖?

3 个答案:

答案 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)都在

  1. 编译类路径
  2. 运行时类路径
  3. 如果您使用的是Show Console in Windows Application?Gradle等构建工具来构建&然后运行类路径,包括传递依赖,将为您管理。如果您正在手动编译/运行,则需要确保传递依赖性在编译时和编译时。运行时类路径。