Java 检查元素是否验证了条件

Java 检查元素是否验证了条件,java,unit-testing,java-8,mockito,Java,Unit Testing,Java 8,Mockito,我有一张物品清单。我想知道是否调用了某些对象方法 i、 e: List<Object> list = ...; Object first = spy(new Object()); Object second = spy(new Object()); list.add(first); list.add(second); callToStringToOnlyOneRandomElement(list); XOR如果发生这种情况: verify(first, times(1)).toS

我有一张物品清单。我想知道是否调用了某些对象方法

i、 e:

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

callToStringToOnlyOneRandomElement(list);
XOR如果发生这种情况:

verify(first, times(1)).toString();
verify(second, never()).toString();
verify(first, never()).toString();
verify(second, times(1)).toString();
但在其他情况下(如果调用
first.toString()
second.toString()
), 或者如果两者都没有被调用)

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


目前,我使用的是
mockito1.9

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

总而言之,竞争条件是单元/自动测试中最糟糕的事情之一,因此设计它们总是更好的。
当您测试竞态条件时,您创建的测试可能会随机通过或失败(如果它通过,则不100%表示您的函数工作正常,也可能意味着由于某些随机事件,您尝试测试的竞态条件没有发生)。

通常,线程的行为不应成为单元测试的主题。 结果可能会有很大的不同,集成测试套件更适合这种场景

如果您真的必须这样做,那么您需要在同一测试方法中考虑这两个选项。您不能将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();
}

列表允许您多次放入同一元素。因此,您的测试可能很简单:

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

list.add(spy);
list.add(spy);

callToStringToOnlyOneRandomElement(list);

verify(spy, times(1)).toString();
List=。。。;
Object spy=spy(新对象());
添加(间谍);
添加(间谍);
调用字符串TOONLYONERANDOMElement(列表);
验证(spy,times(1)).toString();

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