【问题标题】:Check if a element verifies the condition检查元素是否验证条件
【发布时间】:2018-01-07 23:54:29
【问题描述】:

我有一个对象列表。我想知道是否调用了某些对象方法。

即:

List<Object> list = ...;
Object first = spy(new Object());
Object second = spy(new Object());
list.add(first);
list.add(second);

callToStringToOnlyOneRandomElement(list);

我想知道如何进行验证部分。如果发生这种情况,测试就OK了:

verify(first, times(1)).toString();
verify(second, never()).toString();

如果发生这种情况,异或:

verify(first, never()).toString();
verify(second, times(1)).toString();

但在其他情况下不会(如果调用了 first.toString()second.toString(), 或者如果两者都没有被调用)。

对于上下文:真正的问题涉及线程和竞争条件。我想知道是否直接处理了 10 个元素,以及是否所有其他元素都进入了私有队列。因为调用是同时发生的,所以没有直接处理数组元素的顺序(这是预期的行为)。

目前,我正在使用Mockito 1.9

【问题讨论】:

  • 两次将同一个对象添加到列表中,并检查有问题的方法只调用了一次。
  • 你试过什么?您能否向我们展示一些未按预期工作的示例代码或一些研究迹象
  • 您提供的上下文和 XOR 的示例 - 它们不相互矛盾吗?
  • @Lino 这是一个“最佳实践”问题。没有“不工作”的例子。

标签: java unit-testing java-8 mockito


【解决方案1】:

一般来说,线程的行为不应该成为单元测试的主题。 结果可能会有很大差异,集成测试套件更适合这种场景。

如果确实需要,则需要在同一测试方法中同时考虑这两个选项。您不能将 mockito verify 调用与逻辑运算符的使用结合起来,但有一个解决方法是:

boolean firstOptionFail = false;

try{
   verify(first, times(1)).toString();
   verify(second, never()).toString();      
}catch (MockitoException e) {
    firstOptionFail = true;
}

if(firstOptionFail){
  verify(first, never()).toString();
  verify(second, times(1)).toString();
}

【讨论】:

    【解决方案2】:

    我不确定 Mock 库是否可以开箱即用地帮助您。我宁愿编写我的模拟对象来验证这一点,或者遵循 Andriy Simonov 的建议(添加一个元素两次并检查该方法是否只调用了一次)

    总而言之,竞争条件是单元/自动测试最糟糕的事情之一,因此最好将它们设计出来。 当您测试竞争条件时,您创建的测试可能会随机通过和失败(如果它通过,它不是 100% 意味着您的功能正常工作,也可能意味着由于一些随机的事情竞争条件,您试图测试只是没有发生)。

    【讨论】:

      【解决方案3】:

      列表允许您多次放入 same 元素。所以你的测试可以像这样简单:

      List<Object> list = ...;
      Object spy = spy(new Object());
      
      list.add(spy);
      list.add(spy);
      
      callToStringToOnlyOneRandomElement(list);
      
      verify(spy, times(1)).toString();
      

      【讨论】:

        猜你喜欢
        • 2013-03-06
        • 1970-01-01
        • 2015-07-05
        • 1970-01-01
        • 2018-04-18
        • 2011-06-20
        • 2021-12-16
        • 2021-01-14
        • 1970-01-01
        相关资源
        最近更新 更多