我有以下代码:
public class TypesEngine
{
@VisibleForTesting
void types(@NonNull final FindTypes findTypes, @NonNull final List<String> types)
{
final ExecutorService executorService = Executors.newFixedThreadPool(TYPES_NUMBER_OF_THREADS);
for (final String type : types)
{
executorService.execute(new Runnable()
{
@Override
public void run()
{
try
{
findTypes.getRelatedInformation(type);
}
catch (final TypeNotFound e)
{
log.info(String
.format(
"Caught TypeNotFound for type [%s].",
type));
}
}
});
}
executorService.shutdown();
}
}
我尝试了以下单元测试:
@Test
public void test_Types() throws Exception
{
final List<String> types = Lists.newArrayList("type1","type2","type3");
doAnswer(new Answer() {
@Override
public Object answer(final InvocationOnMock invocation) throws Throwable {
throw new TypeNotFound();
}
}).when(findTypes).getRelatedInformation(anyString());
typesEngine.types(findTypes, types);
for(final String type : types)
{
verify(findTypes, times(1)).getRelatedInformation(type);
}
}
但它总是给我一个错误,即没有调用验证方法。但是,如果我添加一个system.out.println,我可以看到正在调用不同的类型。
如果有人能告诉我如何编写以下单元测试,那将是很棒的。
我正在使用Mockito进行单元测试。
答案 0 :(得分:0)
您确认在任务提交后立即调用findTypes
给执行者。执行者还没有时间执行其任务。
由于在任务完成之前你无法阻止该设计,所以在验证之前你需要睡足够长的时间。更可靠的方法是将执行程序服务作为参数传递,并调用awaitTermination()
来阻塞,直到执行程序完成,而不是休眠。
此外,您可以使用doThrow()
而不是doAnswer()