我有以下代码:
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进行单位测试。
您正在验证findTypes
已在任务已提交给执行程序后立即调用。执行人还没有时间执行其任务。
由于您无法阻止该设计直到完成任务完成,因此您需要在验证之前足够长时间睡眠。更可靠的方法是将您的执行人服务作为参数传递,并致电awaitTermination()
阻止执行人,直到执行人完成,而不是睡觉。
另外,您可以使用doThrow()
而不是doAnswer()