【问题标题】:Understanding how to do JUnit testing with Mockito doReturn/when for the methods with return type void了解如何使用 Mockito doReturn/when 对返回类型为 void 的方法进行 JUnit 测试
【发布时间】:2017-07-04 09:54:49
【问题描述】:

假设,我有一个测试类,有两种方法如下:

public class TestClass {        
   @Mock
   TestClass testObject;

   @Test
   public void method1() {
      doReturn("str").when(testObject).method2();

      String s1 = testObject.method2(); // This line gives compilation 
      //error. Type mismatch cannot convert from void to string
   }

   @Test
   public void method2() {
   }    

我基本上是在尝试模拟 method2,它是 method1 中的一个依赖项。

但如您所见,method2 返回类型为 void。所以,我使用 doReturn 来模拟它。

据我了解,虽然 method2 的返回类型是 void,但在我模拟后,method2 的模拟版本应该返回 String 类型。

但是,正如我在方法 1 中评论的那样,它给出了类型不匹配。

【问题讨论】:

  • @D.Peter doReturn/when 用于模拟 void 方法。我正在尝试做同样的事情,但必须知道我错过了什么..

标签: unit-testing junit mockito


【解决方案1】:

你只是弄错了嘲笑

Mocking 的意思是:您不是创建特定类的“真实”对象,而是创建一个 看起来 像该类的对象的存根/虚拟/模拟。但实际上 - 它不是。

除此之外:模拟不能改变方法的签名。因此,您认为可以以某种方式使用模拟来让 void 方法返回某些内容的想法是错误

您只是走错了兔子洞 - 您打算不可能实现。

【讨论】:

  • 感谢您的建议...我基本上是在尝试模拟一个返回类型为 void 的方法。我正在浏览这个链接,它建议我可以使用 doReturn/when 来做到这一点:stackoverflow.com/questions/2276271/… 所以,我试图模拟一个返回类型为 void 并期望字符串作为返回值的方法。但似乎你不能这样做。
  • 在我的实际服务类中,method2返回一个String类型的值。但是,在我的测试类中,我将 method2 的返回类型更改为 void,因为它是一种更好的编码实践。因此,即使在将 method2 的返回类型更改为 void 之后,当我在 method1 中调用它时,我也希望它返回一个 String 类型的值。我试图通过嘲笑的帮助来实现它,正如我在我的问题中所展示的那样。但是,我收到类型不匹配错误。那么,我想要实现的目标是不可能的?
  • 没错。您所描述的根本不是一种更好的编码实践。不知道你从哪里得到这个想法。除此之外:请不要进入“用 cmets 写的更多问题”乒乓球。
  • 我的意思是,将测试方法的返回类型设置为 void 是一种更好的编码习惯。
  • 我只想更好地理解 doReturn/when,这应该有助于模拟返回类型为 void 的方法。您的回答表明它没有帮助,但没有帮助我理解我是如何使用 doReturn/when 错误的。无论如何,我赞成你的回答。
【解决方案2】:

我认为您使用了错误的方法。 doReturn 允许您“注入”执行结果。如果你想“伪造”整个方法的执行,你应该考虑使用doAnswer

doAnswer(new Answer<Void>() {
    public Void answer(InvocationOnMock invocation) {
      // whatever you want to execute here...
      // Simply return null
      return null;
    }
}).when(testObject).method2();

【讨论】:

  • 感谢您的回答。在我的实际服务类中,method2 返回一个字符串类型的值。但是,在我的测试类中,我将 method2 的返回类型更改为 void,因为它是一种更好的编码实践。因此,即使在将 method2 的返回类型更改为 void 之后,当我在 method1 中调用它时,我也希望它返回一个 String 类型的值。我试图通过嘲笑的帮助来实现它,正如我在我的问题中所展示的那样。但是,我收到类型不匹配错误。那么,我想要实现的目标是不可能的?
  • 你只是不能这样做。您无法更改方法的擦除。这是Java等静态类型语言附带的东西。因此,您没有“将 method2 的返回类型更改为 void”。您刚刚定义了一个新方法。即使你这样做了,你也不能定义一个新方法,其签名与返回类型上的另一个不同
  • 如果你一直坚持执行那个方法,我想你可以使用反射,但我不确定会发生什么
  • 服务类的方法返回类型为字符串。后来,当我在测试类中为该方法编写测试时,我将返回类型更改为 void。谢谢你的回复,看来我做错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
相关资源
最近更新 更多