可运行的单元测试



我有以下代码:

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()

相关内容

  • 没有找到相关文章

最新更新