2013-05-20 2 views
5

나는 실패 할 때 어떤 메소드가 리콜 될지 테스트하려고한다. 별도의 스레드에서 호출이 호출됩니다. 그래서 나는 이와 같은 코드를 작성합니다.멀티 스레딩에서 easymock 사용하기

final Foo mock = createStrictMock(Foo.class); 

mock.bar(); 
expectLastCall().andThrow(new RuntimeException("TEST EXCEPTION")); 
mock.bar(); 
replay(mock); 

doStuff(); 
sleepSomeTime(); //Pretty dirty. But I need to test it in multithreading. 
verify(mock); 

그리고 테스트가 통과되었습니다. 하지만 아직 리콜을 구현하지 않았습니다.

내가

mock.bar(); 
expectLastCall().andAnswer(new IAnswer<Void>() { 
     @Override 
     public Void answer() throws Throwable { 
      sleepSomeTime(); 
      throw new RuntimeException("TEST EXCEPTION"); 
     } 
    }); 

mock.bar(); 
expectLastCall().andThrow(new RuntimeException("TEST EXCEPTION")); 

교체, 테스트가 실패 할 것이 아니라 내 모든 테스트 주위에 sleepSomeTime를 추가 좋아하지 않는다. 그 옆에, 나는이 특별한 경우에 도움이되는 동안 실제로 이해하지 못한다. 그래서

왜 지연을 추가하면 도움이 되었습니까?

그런 것들을하는 올바른 방법은 무엇입니까?

답변

5

내 접근 방식은 잠금 장치를 사용했습니다. 이 꽤 충분한 정보가 확실한 뭔가를 보여 게시물에 아니지만, 그것은 아마도 다음과 같이 보일 것입니다 :

final Lock lock = new Lock(); 
lock.lock(); 
expectLastCall().andAnswer(new IAnswer<Void>() { 
    @Override public Void answer() throws Throwable { 
     lock.unlock(); 
     throw new RuntimeException("TEST EXCEPTION"); 
    } 
});  
doStuff(); 
lock.lock(); 
verify(mock); 

여기서 요점은 두 번째 잠금()를 호출하여 모의에서 해제 될 때까지 차단된다 자물쇠를 풀어 준다.

+1

최상의 답변입니다. 그러나 나는 이것이 자물쇠없이 이루어져야한다고 생각합니다. –

+0

코드에 따라 콜백을 연결할 수 있으므로 확인 방법은 모의 마지막 줄을 간질 이는 콜백에서 수행됩니다. –

-1

스윙 워커를 사용하여 구현하려 했습니까?

또한 시도하고 싶은 것이 있다면 notify을 사용하거나 synchronized 클래스를 사용해보십시오.

0

멀티 스레드 컨텍스트에서 단위 테스트를 수행하는 쉬운 방법은 없습니다.

하지만이 글은 answer to another similar question입니다. DRTestUtils은 몇 가지 편리한 방법을 에 제공합니다.Thread.sleep 뒤에 더 좋은 waitForCondition 메서드 호출을 숨 깁니다.

관련 문제