2016-06-06 2 views
1

개인 및 공개 또는 보호 된 메소드가있는 Foo 클래스가 있습니다. 예 :Mockito JUnit 테스트 : 생성자에서 메소드 호출 확인

public class Foo{ 

    private int number; 
    public Foo(){ 
     setup(); 
     doSthing(); 
    } 

    private void doSthing(){ 
     number=10; 
    } 

    public void setup(){ 
    } 

    protected int getNumber(){ 
     return number; 
    } 

    public void run(){ 
     getNumber(); 
     //Do blah blah... 
    }  
} 

그리고이 클래스를 Mockito를 사용하여 테스트하려고합니다.

public class FooTest 
{ 
    public void testMethods() 
    { 
     Foo foo = PowerMockito.mock (Foo.class); 

     //1 What should I do to see that setup() and doSthing() 
     //has been called on Foo construction 

     mock.run(); 
     //2 What should I do to see that getNumber() 
     //has been called on run() method call 
    } 
} 

가능한 경우 "시간 (1)"을 포함하고 싶습니다. 도와 주셔서 감사합니다. 모든

첫째 : 다음 PowerMock ... 프레임 워크 중 하나를 사용하지 마십시오

+0

"setup() 및 doSthing()을 보려면 어떻게해야합니까?"해당 메서드가 설정 한 클래스의 invariant를 선언하십시오. –

+0

Grr, 질문을 삭제하고 재 게시 한 이유가 무엇입니까? 방금 입력 한 30 개의 답을 잃었습니다. – GhostCat

+0

왜 테스트중인 수업을 조롱하고 있습니까? –

답변

2

당신이 잘못을 얻고있다. 그들은 바이트 코드 조작에 의존합니다. 조만간 문제가 생길 수 있습니다. 절 믿으세요, 좋은 이유없이 많은 시간을 정말로 이상한 사냥으로 보냈습니다.

다음 :이 방법으로 코드를 테스트하지 마십시오!

당신은 그 객체를 제어/만들 수 조롱 프레임 워크를 사용하여 당신이 통과하여 "테스트중인 클래스"에. 프레임 워크를 사용하여 "테스트중인 클래스"를 직접 테스트하지 마십시오!

개인 메서드를 알고있는 테스트 코드를 작성하고 싶지는 않습니다. 이는 구현 세부 사항입니다.

대신 할 무엇 :

a)에 말했듯이, 당신은 테스트중인 클래스에 물체를 통과 조롱 사용할 수 있습니다. 그런 다음 해당 모의 객체가 "테스트중인 클래스"가 수행 할 것으로 예상되는 호출을 확인/확인 할 수 있습니다.

b) "테스트중인 클래스"의 객체를 만든 다음 속성을 "확인"합니다. 그 물체들; 또는 메소드 호출이 리턴하는 결과에 영향을 미칩니다.

정확하게 말하면 : 조롱 된 개체 ... "원래"클래스의 코드에 대해 알지 못합니다. 모의입니다! 귀하의 질문에 귀하가하고자하는 테스트의 종류에는 사용할 수 없습니다. 여러분이 실제 수업에서 메서드를 호출하거나; 또는 모의 (mock)을 위해 뭔가를 지정하십시오. 그러나 모의 객체를 만들어 구체적인 클래스 구현에 "결합"하는 것은 불가능합니다.

마지막으로 : 당신이 당신의 구체적인 클래스는 단지 테스트를 위해 정상적인 방법을 만들 수 실제로 "너무 큰"이라고 생각하면 ... 다음 기회는 : 클래스가 다른 용도로 간단하게 너무 큰입니다. 수업은 작아야합니다. 그들의 디자인은 SOLID 원칙을 따라야합니다.

짧은 이야기 : PowerMock을 사용하여 테스트 할 수없는 코드를 "테스트"로 강제 실행하지 마십시오. 프로덕션 코드의 품질을 향상시키는 데 더 많은 시간을 투자하십시오. 훨씬 더 높은 "ROI"를 가져올 것입니다.

+0

회사의 사람들이 아직 가지고 있지 않은 접근 방식 클래스는 크지 않지만 의존성이 너무 많습니다. 당신과 동의하지만, 계몽에 대한 많은 감사드립니다. – dramaticlook

관련 문제