【问题标题】:Check if void methods were called检查是否调用了 void 方法
【发布时间】:2014-02-02 08:37:48
【问题描述】:

我在第一次使用 Mockito 的 jUnit 测试中陷入困境。

我必须测试一个以 ArrayList 作为参数的方法。在此方法中,将有另一个名为运行运行时执行的类。所以我需要用运行时执行来模拟这个类,因为他们想在 Jenkins 上失败(因为 Jenkins 在 Linux 上运行)。

首先是两个类:
HandleInformation testClass; 将成为 testet 的类
XFDHandler test; 运行时执行的接口,该类称为 XFDHandlerProd

首先我模拟运行时类:

test = Mockito.mock(XFDHandlerProd.class);

这四个方法都是void-方法,所以当我正确理解official doc时,方法本身不应该做任何事情:

注意,mock 上的 void 方法默认什么都不做!

那么我会做我的第一个测试:

@Test
public void testNullList() throws IOException, InterruptedException {
    ArrayList<Info> nullArray = new ArrayList<Info>();

    testClass.handleInformation(nullArray);
    Mockito.verify(test, Mockito.times(1)).turnOnBlue();
}

当我向 testClass 发送一个空 List 时,它应该被称为 Runtime-Class turnOnBlue(); 的 void-method。据我所知,使用verify 方法我可以检查该方法是否真的被调用了。

但是当我现在运行测试时,我会得到以下错误:

需要但未调用:xFDHandlerProd.turnOnBlue();
-> 在 com.example.example.business.HandleInformationTest.testNullList(HandleInformationTest.java:44)
实际上,与此模拟的交互为零。

第 44 行是Mockito.verfiy() 的行

现在我不知道自己做错了什么。


思想
通信为零是因为我在 HandleInformation 类中使用了 XFDHandler 的另一个实例,所以 Mockito 看不到任何活动吗?
如果是这样,我如何能够在测试中使用 Mockito 类而不更改 HandleInformation 类中的任何方法?

【问题讨论】:

  • 您是否在“testClass”中注入/设置“test”实例?您的想法可能是正确的,因为您需要将创建的 XFDHandler 模拟注入到 HandleInformation 类中。您的 HandleInformation 类是如何实例化的?
  • 您能否添加代码来显示您如何设置testClass 对象?
  • 嗯,那不是空数组,那是数组,有区别。不过,这并不是你的问题(或者至少,我对此表示怀疑)。
  • @Clockwork-Muse:好点。它是空还是空都没有关系,但名称确实拼写错误。谢谢

标签: java junit mockito


【解决方案1】:

看来您需要将 colaborator 作为参数传递。这意味着你需要这样的东西:

XFDHandler test = Mockito.mock(XFDHandlerProd.class);
HandleInformation testClass = new HandleInformation(test);

那么你的测试就可以了。

顺便说一句,我会删除 Mockito.times(1),因为它是默认行为

【讨论】:

  • 正是如此。非常感谢。是的,我刚刚在文档中看到它,我可以删除它。干杯
【解决方案2】:

您应该使用 setter 或构造函数将您的模拟对象注入到您的测试对象中,或者只是作为方法参数传递,以便 mockito 可以了解您正在测试的对象何时调用模拟对象方法

【讨论】:

    猜你喜欢
    • 2019-06-06
    • 1970-01-01
    • 2016-06-12
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    相关资源
    最近更新 更多