【问题标题】:Mockito issue - when(java.lang.Void) in Stubber cannot be applied to voidMockito 问题 - Stubber 中的 when(java.lang.Void) 无法应用于 void
【发布时间】:2014-08-11 18:22:17
【问题描述】:

我不明白为什么doNothing 不适合这个?有什么想法吗?

@Captor
ArgumentCaptor<GenericClass<someOtherClass>> captor;
...
Mockito.doNothing().when(mockObject.methodToStub(captor.capture()));

错误是:

Exception: when(java.lang.Void) in Stubber cannot be applied to void

【问题讨论】:

    标签: java mocking mockito


    【解决方案1】:

    这个存根是错误的:

    doNothing().when(mockObject.methodToStub(captor.capture())); // wrong
    

    如果使用此 API 样式,methodToStub(...) 必须在 when 之外(它应该只包含模拟):

    doNothing().when(mockObject).methodToStub(captor.capture()); // correct
    

    然而,尽管评论:

    1. doNothing 是模拟的 void 方法的默认值。
    2. 您可以使用BDDMockito 别名,使您的代码成为真正的à la 行为驱动开发

    【讨论】:

      【解决方案2】:

      虽然您问为什么 doNothing 不起作用,但我知道您实际上想要捕获 methodToStub 的参数。

      最直接的方法是:

      verify(mockObject).methodToStub(captor.capture());
      

      如果您只想在 void 方法调用上模拟什么都不做,请记住,什么都不做是模拟上 void 方法的默认

      如果由于某种原因您仍需要调用doNothing,则应注意括号的位置。它应该是这样的:

      doNothing().when(mockObject).methodToStub(any());
      

      或 doNothing().when(mockObject).methodToStub(captor.capture());

      【讨论】:

      • 感谢您的回复。当调用 methodToStub 时,我实际上不希望发生任何事情。我理解(可能不正确)需要 ArgumentCaptor,因为在被存根的方法中使用了泛型。
      • 让我确保我理解:您只是希望在调用 methodToStub 时什么都不发生?而mockObject是用mock(YourClass.class)创建的mock对象?
      • 编辑了答案。看看这对你有没有帮助。
      • 谢谢。这很有帮助。我一定是做错了。我想取消调用,但是这个类被注入到框架的其他地方,所以我不确定这个模拟是否真的有效。
      • 可能是您尝试进行部分模拟(mockObject 就像 RealObject 一样工作,除了调用 methodToStub 时,它什么也不做)呢?如果您可以发布一个更完整的示例来说明您当时正在尝试做什么,那将会很有用;如果你的框架是 Spring,我相信我可以提供帮助,如果不是,一个好的、清晰、具体的问题肯定会被其他人回答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多