gpt4 book ai didi

java - 如何在 Mockito 中表达 "A, then (B or C)"调用顺序?

转载 作者:行者123 更新时间:2023-11-30 06:25:04 25 4
gpt4 key购买 nike

我在模拟对象上调用了三个方法。在其他两个方法之前调用其中一个方法很重要,但我不关心最后两个方法的调用顺序。

这个逻辑可以用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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com