gpt4 book ai didi

java - 实现 Mockito 的 Answer 接口(interface)来测试方法的所有分支

转载 作者:行者123 更新时间:2023-12-01 08:49:30 25 4
gpt4 key购买 nike

我是 Mockito 新手。我试图在我的测试类中使用 Mockito 的 Answer 接口(interface)来测试 getAllFoo() 方法的所有分支。我希望 isFooComplete() 在前两次调用时返回 false,然后第三次返回 true,以便 actualFoo 在测试结束时包含 2 个 Foo 对象。

问题是,在 for 循环中,我在 service 上调用 getAllFoo(),第一次返回 false,那么测试就会陷入无限循环(正如您所期望的那样查看 getAllFoo() 方法实现)。

如何修改此测试,以便 getAllFoo() 返回 false 两次,然后返回 true 并终止循环?

服务等级:

public class ServiceImpl {

@Autowired
FooService fooService;

public Collection<Foo> getAllFoo() {
Collection<Foo> allFoo = new ArrayList<>();
boolean complete = fooService.isFooComplete();
boolean available = fooService.isFooAvailable();
while (!complete && available) {
Foo foo = fooService.getAvailableFoo();
allFoo.add(foo);
}
return allFoo;
}
}

测试类:

public class ServiceImplTest {

@InjectMocks
ServiceImpl service = new ServiceImpl();

@Mock
FooService fooService;

class MyAnswer implements Answer<Boolean> {
int counter = 0;

@Override
public Boolean answer(InvocationOnMock inovation)
throws Throwable {
return (counter++ > 2) ? Boolean.TRUE : Boolean.FALSE;
}
}

@Test
public void testGetAllFoo() {
MyAnswer myAnswer = new MyAnswer();

MockFoo mockFoo = new MockFoo();

when(fooService.isFooComplete()).thenAnswer(myAnswer);
//when(fooService.isFooComplete()).thenReturn(false, false, true);
when(fooService.isFooAvailable()).thenReturn(true);
when(fooService.getAvailableFoo()).thenReturn(mockFoo);

Collection<Foo> actualFoo = new ArrayList<>();
for (int i = 0; i < 3; i++) {
actualFoo = service.getAllFoo();
}
assertTrue(actualFoo.contains(mockFoo));
assertEquals(2, actualFoo.size());
}
}

最佳答案

在您的示例中,您没有增加计数器。因此,您的计数器始终为 0。因此,在返回并将条件更改为 counter >= 2 之前,应该使用 counter++ 来完成此操作。

但看起来您正在这个答案中实现部分 FooService 逻辑。我认为 when(fooService.isFooComplete()).thenReturn(true, true, false) 可能是更好的选择。

关于java - 实现 Mockito 的 Answer 接口(interface)来测试方法的所有分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42472441/

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