gpt4 book ai didi

java - 测试根据输入调用内部方法的公共(public)方法

转载 作者:行者123 更新时间:2023-12-01 13:17:52 27 4
gpt4 key购买 nike

所以我们这里有这个方法,系统的其余部分可以访问它,系统的其余部分根据输入调用底层方法。

public SomeReturnObj doSomethingWithInputs(List<Input> inputs) {
for(Input input : inputs) {
if(input.getName().equals("A") {
handleAInput(input);
}
else if(input.getName().equals("B") {
handleBInput(input);
}
else { ... }
}

// ...
}

为了获得良好的代码覆盖率,我想测试一下,如果我放置一个包含两个名为 AInput 和三个名为 B 的列表,相应的内部方法分别被调用两次或三次。

所以我尝试了以下方法:

@Test
public void separatingInputsByName() {
Input entry1 = mock(Input .class);
Input entry2 = mock(Input .class);
Input entry3 = mock(Input .class);

doReturn("A").when(entry1).getName();
doReturn("A").when(entry2).getName();
doReturn("B").when(entry3).getName();

ClassUnderTest sut = mock(ClassUnderTest .class);

sut.doSomethingWithInputs(Arrays.asList(entry1, entry2, entry3));

verify(sut).handleAInput(entry1);
verify(sut).handleAInput(entry2);
verify(sut).handleBInput(entry3);
}

不幸的是,这不会导致内部方法的正确调用,可能是因为被测试的类是模拟的,所以方法实现是不同的。

如何正确测试/验证这样的方法?

最佳答案

您应该使用spy(),而不是mock()

当您使用mock()时,所有方法都会被“覆盖”,以便执行默认操作而不是调用真正的方法; spy() 将简单地注册方法调用。

因此:

ClassUnderTest sut = spy(new ClassUnderTest(...));

sut.doSomethingWithInputs(Arrays.asList(entry1, entry2, entry3));

verify(sut).handleAInput(entry1);
verify(sut).handleAInput(entry2);
verify(sut).handleBInput(entry3);
verifyNoMoreInteractions(sut); // if necessary

此外,您还可以:

when(entry1.getName()).thenReturn("A");

就我个人而言,我发现它更容易阅读,但这当然是一个品味问题。

此外,您还可以在您的情况下使用 InOrder:

final InOrder inOrder = inOrder(sut);

inOrder.verify(sut).handleAInput(entry1);
// etc

关于java - 测试根据输入调用内部方法的公共(public)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22320334/

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