作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在模拟对象上调用了三个方法。在其他两个方法之前调用其中一个方法很重要,但我不关心最后两个方法的调用顺序。
这个逻辑可以用Mockito表达吗?据我所知,InOrder
类将强制我对所有三个调用进行排序,如下所示:
InOrder inOrder = inOrder(mock);
inOrder.verify(mock).crucialMethod();
inOrder.verify(mock).methodX();
inOrder.verify(mock).methodY(); // <-- I wouldn't care if this was invoked
// before methodX()
我想解决这个问题,以便我的测试与调用最后两个方法的确切顺序不那么紧密地耦合。
有可能 this question是重复的,但我一直在努力理解 OP 到底在寻找什么,也不知道答案是否适用于我。
最佳答案
您可以使用两个 InOrder 对象:
import static org.mockito.Mockito.*;
import org.junit.Test;
import org.mockito.InOrder;
import org.mockito.exceptions.verification.VerificationInOrderFailure;
public class MyTest {
public interface ToBeTested{
public void crucialMethod();
public void methodX();
public void methodY();
}
@Test
public void testXThenY(){
// Given
ToBeTested toBeTested = mock(ToBeTested.class);
// When
toBeTested.crucialMethod();
toBeTested.methodX();
toBeTested.methodY();
// Then
InOrder inOrderX = inOrder(toBeTested);
inOrderX.verify(toBeTested).crucialMethod();
inOrderX.verify(toBeTested).methodX();
InOrder inOrderY = inOrder(toBeTested);
inOrderY.verify(toBeTested).crucialMethod();
inOrderY.verify(toBeTested).methodY();
}
@Test(expected=VerificationInOrderFailure.class)
public void crucialTooLateForX(){
// Given
ToBeTested toBeTested = mock(ToBeTested.class);
// When
toBeTested.methodX();
toBeTested.crucialMethod();
toBeTested.methodY();
// Then
InOrder inOrderX = inOrder(toBeTested);
inOrderX.verify(toBeTested).crucialMethod();
inOrderX.verify(toBeTested).methodX();
InOrder inOrderY = inOrder(toBeTested);
inOrderY.verify(toBeTested).crucialMethod();
inOrderY.verify(toBeTested).methodY();
}
@Test(expected=VerificationInOrderFailure.class)
public void crucialTooLateForY(){
// Given
ToBeTested toBeTested = mock(ToBeTested.class);
// When
toBeTested.methodY();
toBeTested.crucialMethod();
toBeTested.methodX();
// Then
InOrder inOrderX = inOrder(toBeTested);
inOrderX.verify(toBeTested).crucialMethod();
inOrderX.verify(toBeTested).methodX();
InOrder inOrderY = inOrder(toBeTested);
inOrderY.verify(toBeTested).crucialMethod();
inOrderY.verify(toBeTested).methodY();
}
}
关于java - 如何在 Mockito 中表达 "A, then (B or C)"调用顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16209606/
我是一名优秀的程序员,十分优秀!