gpt4 book ai didi

java - Mockito - 明确的论点捕获者公关

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

我的问题最好用一个简单的例子来描述。这是我的类(class):

public class App  
{
void doFirst(String s){
if(s.equals("hello")){
return;
}
doSecond(s);
}

void doSecond(String s){

}
}

这是我的测试:

public void testApp() {
App a = spy(new App());
ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);
doNothing().when(a).doSecond(argument.capture());
a.doFirst("bye");
assertEquals("bye", argument.getValue());
a.doFirst("hello");
assertEquals(null, argument.getValue());
}

问题在于第二个断言失败,因为 argument.getValue() 具有之前调用 doFirst 的值。我能否在第一次断言后以某种方式清除参数,以便在到达第二个断言时它将为空?

谢谢。

最佳答案

在我看来你正在测试两种不同的条件 -

  • s 不是 "hello" 时,doSecond 会使用正确的参数调用
  • doSecond 不会被调用,当 s"hello"

那应该是两个独立的测试。

另外,不要使用 ArgumentCaptorassertEquals。这就是 verify 的用途。您可以像这样编写测试类。

@RunWith(MockitoJUnitRunner.class)
public class AppTest {
@Spy App toTest;

@Test
public void doSecondIsCalledWhenArgumentIsNotHello() {
toTest.doFirst("bye");
verify(toTest).doSecond("bye");
}

@Test
public void doSecondIsNotCalledWhenArgumentIsHello() {
toTest.doFirst("hello");
verify(toTest, never()).doSecond(anyString());
}
}

关于java - Mockito - 明确的论点捕获者公关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21317757/

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