【问题标题】:How to ignore several void method calls inside a void method in Mockito如何在 Mockito 的 void 方法中忽略几个 void 方法调用
【发布时间】:2012-10-31 18:19:22
【问题描述】:

我正在测试一个 void 方法,它恰好调用了一个类中的其他几个 void 方法(所有这些方法都在同一个类中)。方法就是这样的……

public void methodToTest() {
   methodA();
   methodB();
}

void methodA() {
   methodA1();
   methodA2();
   methodA3();
}

我想做的是让上面的methodA() 什么都不做。也就是我希望methodA()基本上是这样的:

void methodA() { }

我在methodA() 上尝试了doThrow()doAnswer() 均无济于事。就好像这两个都被完全忽略了。

我尝试过的一个例子......

doThrow(new RuntimeException()).when(mockedClass).methodA();

有没有办法只使用 Mockito 来做到这一点?我无权更改正在修改的类。

【问题讨论】:

  • 这应该可以,你确定methodA 不是final 吗?
  • methodA 不是final
  • 回顾你的 sn-p 看起来你想做一个部分模拟,可能只执行methodB,而你正在执行methodA。你肯定在使用mock(YourObject.class),那么当然mock什么都不做,而且肯定永远不会执行真正的代码。您可以实现您想要的spy(YourObject.class),它将默认执行真实代码。但是,部分模拟被认为是测试气味,如果不是设计气味,您应该寻找机会将 methodA 的行为作为可以在 API 中公开为 AStrategy 的依赖项。
  • 可能你理解了上一个问题的含义,但是类本身不能是final的,或者方法是final的,即使修饰符没有在方法上显式声明。所以这门课也不是final的?
  • 到目前为止还没有指出的一点是,一般来说,模拟被测类并不是好的做法。如果您需要在methodA 没有副作用的情况下进行测试,请模拟methodA 调用的对象以达到预期结果。

标签: junit mockito


【解决方案1】:

如果您希望 methodB 仍然执行,而 methodA 什么都不做。这将做到这一点:

TestClass spy = spy(new TestClass());
doNothing().when(spy).methodA();
spy.methodToTest(); 

【讨论】:

  • 我没有在上面提到它,但我实际上使用的是您在示例中列出的间谍。我已经在我的课堂上尝试了这个确切的代码,并且 methodA() 的内部仍在执行,这是我试图避免的......
  • 您是使用上面的doNothing().when() 的倒置表示法,还是使用when().thenReturn() 表示法?后一种形式实际上在调用 when 代码行时调用 Spy 上的真实方法(即,当部分模拟的替代行为被更改时),这可能会导致问题。因此需要在间谍上使用以前的doNothing 符号来避免这个问题
  • @KevinWelker - 我正在使用doNothing().when()
  • 我在写这篇文章之前做了一个快速测试,它的工作方式与我描述的一样。什么时候调用methodA?在 doNothing() 行还是在 methodToTest 行上? methodA 上的方法签名是否有任何修饰符?
  • 对于私有方法检查answer
【解决方案2】:
 @Mock
 ApplicationClass applicationClass; 


 Mockito.doNothing().when(applicationClass).myMethod(Matchers.any(Object.class));

【讨论】:

  • 虽然此代码可以回答问题,但提供有关 如何 和/或 为什么 解决问题的附加上下文将改善答案的长期价值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
相关资源
最近更新 更多