Runnable的单元测试

时间:2016-06-22 07:04:23

标签: java unit-testing junit mockito

我有以下代码:

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进行单元测试。

1 个答案:

答案 0 :(得分:0)

您确认在任务提交后立即调用findTypes给执行者。执行者还没有时间执行其任务。

由于在任务完成之前你无法阻止该设计,所以在验证之前你需要睡足够长的时间。更可靠的方法是将执行程序服务作为参数传递,并调用awaitTermination()来阻塞,直到执行程序完成,而不是休眠。

此外,您可以使用doThrow()而不是doAnswer()