2014-06-18 2 views
1

나는 오늘 Mockito와 땜질을 시작했고, 꽤 투쟁했고, 누군가 나를 곧게 할 수 있기를 바랬다.Tockle With Mockito

기본적으로 내 getName() 메서드의 3 가지 메서드가 호출되는지 확인할 수 있습니다.

Mockito.verify(mock).getPathObj(); 

나는이 오류 치울 : :이 라인을 공격 할 때마다 비록 내 테스트에서 어떤 이유로,

"을 원했지만 호출되지 : mock.getPathObj();" 여기

내 테스트 클래스는

public class TestJavaFileInput { 

@Mock(name = "path") private Path path; 
@InjectMocks private JavaFileInput mock = Mockito.mock(JavaFileInput.class); 

@Before 
public void testSetup(){ 
    MockitoAnnotations.initMocks(this); 
} 

@Test 
public void getNameTest(){ 
    mock.getName(); 
    Mockito.verify(mock).getName(); 
    Mockito.verify(mock).getPathObj(); 
} 
} 

이 사람이 나를 위해 몇 가지 통찰력을 가지고 있는가하는 클래스 I 싶어 테스트 여기

public class JavaFileInput { 

private Path path; 

public JavaFileInput(){ 
    super(); 
    this.path = null; 
} 

public Path getPathObj() { 
    return this.path; 
} 

@Override 
public String getName() { 
    Path path = getPathObj(); //<--I realize I could just use my path member var here. Added for troubleshooting. 
    return path.getFileName().toString(); 
} 
} 

입니까?

나는이 자원을 소진,하지만 난 뭔가를 내려다 쉽게있을 것 같아요 : 는 http://www.vogella.com/tutorials/Mockito/article.html http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#21

+0

실제 JavaFileInput 인스턴스를 테스트하지 않습니다. JavaFileInput 모의 테스트 중입니다. 그건 말이 안돼. 정의에 따르면, 모의 객체의 메소드는 사용자가 수행하도록 지시 한 것 이외의 것을 수행하지 않습니다. –

답변

2

먼저 테스트 할 클래스를 조롱하면 안됩니다. 필요한 외부 의존성만을 조롱하십시오.

둘째, 해당 메서드가 호출되는 시점에 대한 동작을 지정해야합니다. Path 인스턴스가 반환해야하는 항목은 무엇입니까? getFileName()이 호출 될 때 반환 할 항목을 결정해야하므로 모의가 들어갑니다.

when(path.getFileName()).thenReturn(Paths.get("file://some/uri")); 
+0

마코토와 그 외 모든 사람들이 응답했습니다. 정말 고마워요! 나는 지금 얼마나 바보 같은지를 믿을 수 없다.내가 시험하고 싶은 수업을 조롱하려고한다는 사실을 합리화하지도 않았다. 모든 답변 덕분에 이제 유효한 테스트가 실행 중입니다. 다시 한 번 감사드립니다. – Chiefwarpaint

1

Mockito는 당신에게 모의 객체를 제공합니다. 기본적으로 모의 메소드의 호출은 아무 것도하지 않습니다. 따라서 getName으로 전화하면 아무 일도 일어나지 않고 getPathObj이 호출되지 않습니다. spy 또는 callRealMethod을 사용해 볼 수도 있지만 권장하지 않는 것처럼 보이기 때문에 사용하지 않았습니다. (코드 냄새 ...) mockito documentatin.

1

단위 테스트는 개체가 환경과 어떻게 상호 작용 하는지를 확인합니다.

환경은 path입니다.

당신이 당신의 객체로 경로 모의를 삽입 할 수 있다고 가정하면, 당신은이 작업을 수행 할 필요가 :

JavaFileInput input = new JavaFileInput(); 
when(path.getFileName()).thenReturn("xxx.txt"); 
// inject path into input somehow 
assertEquals("xxx.txt", input.getName()); 

당신이 path를 주입 할 수없는 경우, 즉 코드 냄새입니다. 재 설계를 고려하십시오.