在Mockito中没有呼叫依赖

时间:2014-10-14 18:20:35

标签: unit-testing mocking mockito

我有以下代码,只是在这里放一个场景。

  class A{
 public JSONObject m1(type1,type2,type3){
    callmethod2(type3);
 }
 public Map callmethod2(type3){
    //some jobs
    return myMap;
 }
}
@Test
assertequals(JSONObjectTest,m1(type1,type2,type3))

在我的测试中,我正在使用虚拟数据创建一个模拟并将它们传递给实际函数 type1,type2,type3 现在有callmethod2(type3)作为依赖项,所以我不想执行那种方法。所以在我的测试用例中我写了

 when(mockA.callmethod2(any(type3.class))).thenReturn(mockMap);

但我可以看到我的callmethod2正在执行,我怎么能解决这个问题并在我的测试用例中为该方法设置一些预期的结果,所以它不会执行。

1 个答案:

答案 0 :(得分:0)

我写这篇文章时的代码情况有点不完整,但我会尝试在两行之间进行阅读。我假设您正在创建类A的模拟实例。我还假设您正在使用该模拟实例来调用实例方法" m1"。

如果这些事情中的任何一个都不正确,那么你就会遇到问题。如果你没有创建一个模拟实例,那么"当(...)"子句将无法正常运行,实际上你正在调用"当"你还将实际调用A.m1()的真实(即未模拟)实例。如果你正确地模拟A但是在"当"时不使用模拟实例,情况也是如此。子句,或者如果你不在执行/断言语句中使用模拟版本。

但更大的问题是,如果你实际 ARE 正确地创建和使用A的模拟,那么即使是方法的默认模拟功能" m1"变得空虚 - 什么也不做。它永远不会被执行。做你似乎提出的建议的唯一方法是使用Mockito所称的"部分嘲笑",使用间谍。你实例化一个真实的A实例,然后将其包装在Spy中以制作一个" Spied" -instance A.现在,Spied的A实例继承了方法的所有默认实现,你可以模拟出来具体方法如果你喜欢。然后,您必须在yur" whe(...)"中使用间谍实例。子句以及执行/断言语句。

但即使这种努力也值​​得怀疑。您应该尝试将类作为一个整体进行测试,而不是模拟部分行为。一般来说(实际上是一个规则),你应该模拟或监视被测试的课程。如果您认为有必要这样做,那么您的课程可能存在一致性问题,并且它指向设计问题或对良好测试实践的误解。