2011-09-03 3 views
1

테스트 할 코드가 있습니다.Junit 테스트 : 정적 메소드 호출을 테스트 메소드로 호출

public void ackAlert(final Long alertId, final String comment) { 
    final AnyTask task = AnyTask.create(
      "ackAlert", new Class[] { Long.class, String.class }, 
      new Object[] { alertId, comment }); 
    taskExecutor.execute(task); 
} 

테스트를 작성하고 있습니다.

 public void testAckAlert() throws Exception { 

    final Long alertId = 1L; 
    final String comment = "tested"; 

    final AnyTask task = AnyTask.create(
    "ackAlert", new Class[] { Long.class, String.class }, 
    new Object[] { alertId, comment }); 

    taskExecutor.execute(task); 
    expectLastCall(); 

    replay(taskExecutor); 

    testingObjectInstance.ackAlert(alertId, comment); 

    verify(taskExecutor); 

} 

그리고 예외가 있습니다.

java.lang.AssertionError: Unexpected method call execute([email protected]): execute([email protected]): expected: 1, actual: 0

어디에서 오류가 있습니까? 난 문제가 정적 메서드 의 호출에 있다고 생각를 만듭니다.

+0

수르 낡은 레코드/재생 구문을 필요로하지 않는 Java 용 격리/조롱 프레임 워크가 있습니까? – TrueWill

+0

정말요? 어느 것이 좋습니다? –

+0

Java 분야에서 제안이 없습니다. 저는 C# 개발자입니다. 흔히 자바 오픈 소스 도구가 더 성숙해지기 때문에 놀랐습니다. Java 전문가가 다른 라이브러리를 제안 할 수 있기를 희망했습니다. – TrueWill

답변

0

모의 객체를 만드는 위치가 표시되지 않지만 예, EasyMock만으로는 정적 메서드 호출을 조롱 할 수 없습니다. 그러나 PowerMock은 EasyMock 또는 Mockito와 함께 mock a static method call과 함께 사용할 수 있습니다.

@RunWith(PowerMockRunner.class)@PrepareForTest(AnyTask.class)으로 테스트 클래스에 주석을 달아야합니다. 당신이 테스트 할 것이 무엇인지에 따라, 정적 방법을 조롱하는 것이 중요하지 않을 수 있습니다

public void testAckAlert() throws Exception { 

    final Long alertId = 1L; 
    final String comment = "tested"; 
    mockStatic(AnyTask.class); 

    final AnyTask task = new AnyTask(); 
    expect(AnyTask.create(
    "ackAlert", new Class[] { Long.class, String.class }, 
    new Object[] { alertId, comment })).andReturn(task); 

    taskExecutor.execute(task); 
    expectLastCall(); 

    replay(AnyTask.class, taskExecutor); 

    testingObjectInstance.ackAlert(alertId, comment); 

    verify(taskExecutor); 

} 
1

: 그런 다음 테스트는 다음과 같이 보일 것이다. 오류는 테스트중인 메소드에서 작성된 태스크가 모의 객체로 전달 된 태스크와 동일한 것으로 보이지 않기 때문입니다.

AnyTask에 equals 및 hashCode를 구현하여 동일하게 보이도록 구현할 수 있습니다. 또한 테스트 후에 전달 된 태스크를 실행하고 확인하기 위해 '캡처'할 수도 있습니다. 즉,이과 같습니다

public void testAckAlert() throws Exception { 

    final Long alertId = 1L; 
    final String comment = "tested"; 
    mockStatic(AnyTask.class); 

    Capture<AnyTask> capturedTask = new Capture<AnyTask>(); 

    taskExecutor.execute(capture(capturedTask)); 
    expectLastCall(); 

    replay(taskExecutor); 

    testingObjectInstance.ackAlert(alertId, comment); 

    AnyTask actualTask = capturedTask.getValue(); 
    assertEquals(actualTask.getName(), "ackAlert"); 
    verify(taskExecutor); 

} 

당신이 정말로 작업에 대해 아무것도 테스트하지 않는 경우,하지만 그냥 taskExecutor.execute()를 호출 할 때, 당신은 단순히 대체 할 수

taskExecutor.execute(task); 

taskExecutor.execute(isA(AnyTask.class)); 

또는 심지어

taskExecutor.execute(anyObject(AnyTask.class));