2017-12-04 22 views
1

Mockito/Powermock을 사용하여이 코드 조각에 Junit을 작성하도록 도와주세요. 어려운 의한 람다 식과 실행기 서비스 여기스레드 스레드 = 새 스레드 (() -> {/ code} 및 Executorservice.submit (thread). powermock을 사용하여 junit을 작성하는 방법

public class myClass { 

    ExecutorService executorService; 

    public void testMethod(String a){ 
     Thread thread = new Thread(() -> { 
      //logic 
      a= testDAo.getStatus(); 
      while (true) { 
       if (Thread.interrupted()) { 
        break; 
       } 

       if (a() != "done" || a() != "fail") { 
        Thread.yield(); 
        try { 
         Thread.sleep(10000); 
        } catch (InterruptedException e) { 
        } 
       } else { 
        break; 
       } 
      } 
     } 
     Future task = executorService.submit(thread); 

     while (!task.isDone()) { 
      try { 
       Thread.sleep(10000); 
      } catch (InterruptedException e) { 
      } 
     } 
    } 

} 

답변

1

다양한 것들.

모든
  • 첫째는 취출 때문에 (매우 유용 할 수 same thread executor를 이용하여 실행 프로그램과 병렬 실행을 테스트하기위한 평행면)
  • 단위 테스트를 작성하는 데 어려움이 있습니다. 생산 코드가 너무 복잡하기 때문입니다.

따라서 실제 답변은 한 단계 뒤로 물러나 생산 코드를 개선하는 것입니다. 왜 다시 스레드을 실행자 서비스로 밀어 넣고 있습니까?

Executor 서비스는 이미 스레드 풀에서 작업하고 있습니다 (적어도 일반적으로 사용하는 방법). 따라서 스레드를 스레드 풀로 밀어 넣은 다음 "두 번"(처음에는 해당 스레드 내에서, 그리고 이후에는 외부에서) 기다리는 코드를가집니다. 그것은 단지 작은 이득을 위해 엄청난 복잡성을 추가합니다.

길고도 짧은 이야기 :

  • 내가 그 "내부 스레드"제거 것 - 결과가 사용할 수있을 때까지 단지
  • 그런 다음 실행 프로그램 작업 대기가 : 람다의 당신에게 문제를 제공하는 경우 - 다음 돈 ' 그들을 사용하지 마십시오. 그 코드를 구현하는 명명 된 작은 클래스를 생성하면됩니다. 그런 다음 작은 클래스에 대한 단위 테스트를 작성할 수 있습니다. 다른 말로하면 : 5 가지 다른 일을하는 거대한 "단위"를 만들지 말라. 좋은 단위의 본질은 하나 건 (단 책임 원칙!)입니다. 그리고 그 아이디어를 따르 자마자 테스트도 훨씬 쉽게됩니다.
+0

입력 해 주셔서 감사합니다. 아래 코드를 사용하여이 작업을 수행 할 수 있습니다. 실제 스레드가 실행되도록하고 Mockito와 Powermock을 사용하여 스레드 내부의 모든 논리를 조롱했습니다 .Spy @SpyExecutorService executorService = Executors.newFixedThreadPool (2); –

+0

내 솔직한 의견 : 잘못된 접근. ** 복잡한 제품 코드를 테스트하기 위해 ** 열심히 노력하고 PowerMock을 사용하여 증상을 해결했습니다. 그것이 바로 PowerMock이 나쁜 선택이되는 이유입니다. 사람들이 나쁜 디자인을 유지하도록 장려하기 때문에 ... – GhostCat