2009-05-10 3 views
1

나는이 다음과 유사 방법 :자체에 대한 널 (null) 값을 반환하는

public void myMethod(MyClass c) 
{ 
    if (c == null) 
    { 
    return; 
    } 
    try 
    { 
    c.someMethod(); 
    } 
    catch (SomeException e) 
    { 
    // log the exception, possibly re-throw 
    } 
} 

나는 MyClass의 매개 변수의 모의 인스턴스를 설정하는 방법을 찾기 위해 노력하고 있습니다를 c 자체에 대해 null 값을 리턴하고 c.someMethod()는 절대로 호출되지 않습니다. 내 단위 테스트는 다음과 같습니다

@Test 
public void Test_myMethod_With_Null_MyClass_Does_Not_Call_someMethod() 
{ 
    Mockery mockery = new Mockery() 
    {{ 
      setImposteriser(ClassImposteriser.INSTANCE); 
    }}; 

    final MyClass mockMyClass = mockery.mock(MyClass.class); 

    try 
    { 
     mockery.checking(new Expectations() 
     {{ 
      oneOf(mockMyClass).equals(null); 
       will(returnValue(true)); 

      never(mockMyClass).someMethod(); 
     }}); 
    } 
    catch (Exception e) 
    { 
     logger.fatal(e); 
     fail("Exception thrown in test."); 
    } 
    Util.myMethod(mockMyClass); 
} 

을 기본적으로, MyClass에의 모의 인스턴스를 설정하고 그 값이 null 값에 대해 테스트 할 때, 그것이 사실 돌려 보낼 그것에 기대를 설정하고있어 someMethod() 메서드는 호출되지 않습니다.

jMock은 Object 클래스 (equals (null) 부분)에서 제공하는 메서드를 재정의 할 수 없다고 말하므로 테스트가 실패합니다.

jMock으로이 작업을 수행 할 수있는 방법이 있습니까? 이 패턴이 의미가 있습니까? 이것이 유효한 시험입니까? 그렇지 않다면 누구에게나 이것을 테스트하는 방법에 대한 제안이 있습니까?

답변

3

이 코드는 JMock 만 사용하여 테스트 할 수 있다고 생각하지 않습니다.

null을 직접 전달하여 테스트 해 보겠습니다. 예외가 발생하거나 로그온 한 경우, 당신은 당신이 좀 더 명시 적으로 확인하고 싶었 경우 try/catch 블록에서 myMethod(null) 호출을 래핑 수

public void Test_myMethod_With_Null_MyClass_Does_Not_Call_someMethod() 
{ 
    Util.myMethod(null); 
    //no exception should be thrown. 
} 

테스트 @. 코드가 예상대로 작동하는지 알고 있지만, 장애가 발생한 경우 실패 이유를 명확히하기 위해 필요한 경우를 제외하고는 필요하지 않습니다. 당신이 c 경우 null 다음 물론 c.something()를 호출 할 수 없음을 알고 있기 때문에

public void Test_myMethod_With_Null_MyClass_Does_Not_Call_someMethod() 
{ 
    try 
    { 
     Util.myMethod(null); 
    } 
    catch(ExpectedException e) 
    { 
     fail("Should not have thrown exception: " + e.getMessage()); 
    } 
} 

이 충분한 테스트입니다.

+0

이것이 실제로 테스트하는 유일한 방법이라고 생각합니다. 즉, null을 전달하는 것입니다. 그냥 mock을 할 실제 방법이 있는지 확인하십시오. 건배! – matt

1

가짜는 객체가 공동 작업자와 상호 작용하는 방식을 테스트하는 데 사용됩니다. 공동 작업자가 없다면 아무 것도 할 수 없습니다. null을 전달하는 것은 더 간단하고 표현력이 있습니다.