gpt4 book ai didi

java - 仅验证方法池中的特定交互

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

我目前正在编写黑盒测试,我必须使用 Mockito 验证是否使用特定参数调用了方法池中的一个方法。调用特定方法并不重要,但必须调用其中的一个方法。此外,如果方法被调用,我想验证它们是否仅使用特定参数调用。

在具体层面上:

我有这个类被模拟并注入(inject)我的黑​​匣子:

class Mock {
void option1(String arg1)
void option2(String arg1, int arg2)
void option3(String arg1, int arg2, int arg3)
void otherMethod()
}

在黑盒中,一个或多个“optionX”方法被调用一次或多次。

现在我想验证至少有一个“optionX”方法在黑盒中被调用,并且如果任何“optionX”方法被调用,它只会用特定的参数调用。

目前的测试代码是这样的

Mock mock = spy(realObject);
blackbox.doBlackboxStuff(mock);

verify(mock, atLeast(1)).option1("Test");
verify(mock, atLeast(1)).option2("Test", 1);
verify(mock, atLeast(1)).option3("Test", 1, 2);
verifyNoMoreInteractions(mock);

像上面这样单独的“atLeast(1) 验证”是行不通的,因为这样每个方法都必须被调用。另外,我不能保证黑匣子不会调用 otherMethod(),因此 verifyNoMoreInteractions 会失败,即使我不关心 otherMethod() 调用也是如此。

有没有一种优雅的方法来解决这个问题(或者至少是一种方法)?

最佳答案

有一种方法有点老套,但应该可行:

MockingDetails details = Mockito.mockingDetails(mock);
Collection<Invocation> invocations = details.getInvocations();

for(Invocation invocation: invocations){
if(CollectionUtils.isNotEmpty(invocation.getRawArguments()){
return;
}
}

fail();

所以基本上,如果至少一个调用包含任何参数,您的测试就会通过。假设 otherMethod 没有示例中的参数。

如果需要更多定制请引用:MockingDetailsInvocation

关于java - 仅验证方法池中的特定交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57482101/

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