2017-09-24 40 views
1

如何对执行程序服务中运行的代码进行单元测试? 在我的情况,如何对执行程序服务中运行的代码片段进行单元测试,而不是等待Thread.sleep(时间)

public void test() { 
    Runnable R = new Runnable() { 
     @Override 
     public void run() { 
      executeTask1(); 
      executeTask2(); 
     } 
    }; 

    ExecutorService executorService = Executors.newSingleThreadExecutor(); 
    executorService.submit(R); 
} 

当我的单元测试,我想提出一些验证该方法执行。

我在执行程序服务中执行此操作,因为它执行一些网络操作。

在我的单元测试中,我必须等到这个方法结束执行。有没有更好的方式可以做到这一点,而不是等待Thread.sleep(500)

单元测试代码片段:

@Test 
public void testingTask() { 
    mTestObject.test(); 
    final long threadSleepTime = 10000L; 
    Thread.sleep(threadSleepTime); 
    verify(abc, times(2)) 
      .acquireClient(a, b, c); 
    verify(abd, times(1)).addCallback(callback); 
} 

注:我传递一个执行服务对象到这个构造函数的类。 我想知道是否有一种很好的测试方式,而不是等待睡眠时间。

回答

1

有几个选项:

  • 提取代码出了执行服务并对其进行测试“独立”,即在你的榜样测试executeTask1()executeTask2()自己或连在了一起,但只是没有被执行他们在一个单独的线程。你是“路过的执行服务对象到这个构造函数类”,这有助于在这里,因为你可以有

    • 它嘲笑执行服务,并验证您提交的正确运行的吧
    • 测试(测试s),它们验证executeTask1()executeTask2()的行为,而不在单独的线程中运行它们。
  • 使用CountDownLatch允许您的代码执行器服务在完成时向测试线程指示。例如:

    // this will be initialised and passed into the task which is run by the ExecutorService 
    // and will be decremented by that task on completion 
    private CountDownLatch countdownLatch; 
    
    @Test(timeout = 1000) // just in case the latch is never decremented 
    public void aTest() { 
        // run your test 
    
        // wait for completion 
        countdownLatch.await(); 
    
        // assert 
        // ... 
    } 
    
  • 接受,你必须等待另一个线程来完成,并通过使用Awaitility隐藏在你的测试用例Thread.sleep电话丑陋。例如:

    @Test 
    public void aTest() { 
        // run your test 
    
        // wait for completion 
        await().atMost(1, SECONDS).until(taskHasCompleted()); 
    
        // assert 
        // ... 
    } 
    
    private Callable<Boolean> taskHasCompleted() { 
        return new Callable<Boolean>() { 
         public Boolean call() throws Exception { 
          // return true if your condition has been met 
          return ...; 
         } 
        }; 
    } 
    
+0

但要注意,我的方法,这里说executeTask1()和executeTask2(),这里是私人的方法和他们没有任何返回类型。我没有找到这种可靠的测试方式。你能建议为什么这是可靠的方式吗? –

+0

我不认为我可以在没有看到它们的实现的情况下为'executeTask1()'和'executeTask2()'测试的细节提供很多帮助。我不认为我可以提供任何帮助:“我没有找到这种测试可靠的方式”,而没有看到你迄今为止尝试过的。如果您正在尝试修改代码以便从我的答案中选择选项1或选项2,那么可能会提供一个解决特定问题并提供[MCVE](https://stackoverflow.com/help/mcve)的单独问题? – glytching

相关问题