繁体   English   中英

Runnable的单元测试

[英]Unit test for Runnable

我有以下代码:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM