2016-12-21 3 views
-2

최근 동기화를 포함하고이를 테스트하는 방법에 어려움을 겪고있는 코드 조각에 대해 작업하고 있습니다. 이 문제로 얻으려면, 우리는 우리가 CountDownLatch에 대한 단위 테스트를 작성하는 고려할 수 : 동기화 코드를 테스트하려면 어떻게해야합니까?

CountDownLatch l = new CountDownLatch(1); 

new Thread() { 
    @Override 
    void run() { 
     l.await(); 
     System.out.println("good!"); 
    } 
}.start(); 

Thread.sleep(1000); // wait for thread to run 
if (the thread is alive) 
    l.countDown(); 
else 
    System.out.println("bad!"); 

그래서 문제는, 1 초 sleep은 모든 시스템에서 모든 경우에 충분한 될 것이라고 보장이 없다 . 그래서 내 목표는 동기화를 테스트 할 때 특정 상태를 예상하도록이 유형의 잠자기 코드를 제거하는 것이지만 곧 문제가 중지되기 시작한다는 것을 알게됩니다.

나의 현재 솔루션은 스레드의 상태를 조회하는 것입니다 :

Thread t = ... 
t.start(); 

if (t.getState() == Thread.State.WAITING) { 
    l.countDown(); 
    assert(t.getState() == Thread.State.RUNNABLE); // or running or terminated 
} 

내 질문은 :

  1. 것 그 일? 즉, 스레드의 상태가 전환됩니까 원자 적으로이 경우 카운트 다운 래치가 웨이크 업 조건에 도달합니까? (의사가 상태 변경시기에 대해 아무 것도 말하지 않음)
  2. 더 좋습니까? 제안?
+0

스레드 상태를 테스트하지 마십시오. 동작을 테스트하십시오. 귀하의 코드가 무엇을 하려는지 말할 수 없으므로 테스트 방법을 말할 수는 없습니다. –

+0

[동기화하는 방법을 단위 테스트하는 방법]의 가능한 복제본 (http://stackoverflow.com/questions/2825657/how-to-unit-test-synchronized-code) –

+0

@ ИгорьДобровольський 아니, 나는 동기화 메커니즘을 테스트하고 있습니다. 예를 들어, @DavidMoles – HuStmpHrrr

답변

0

예제를 보면 카운트 다운 래치를 거꾸로 사용하고 있다는 느낌이 들었습니다. 왜 그런 식으로 할 수 없습니까?

@Test 
    public void testThreads() throws Exception { 
     CountDownLatch l = new CountDownLatch(1); 

     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       System.out.println("Parallel thread is doing something."); 
       try { 
        // instead of this sleep you put your logic that you want to be executed. 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       l.countDown(); 
      } 
     }).start(); 

     System.out.println("Main thread is waiting for parallel thread"); 
     l.await(); 

     System.out.println("Done."); 
    } 

문제를 이해하지 못하는 경우 제발 저를 수정하십시오.

그러나 일반적으로 말하길, 귀하의 게시물 아래에있는 의견 중 하나에 대해서는 아마 단위 테스트를 통해 멀티 스레딩을 테스트하지 말아야한다는 것에 동의합니다.

관련 문제