2013-11-03 5 views
2

JMockit을 사용하여 Android 앱을 테스트하고 있습니다. 로컬 JVM에서 테스트를 실행하면 모든 Android 클래스가 스텁임을 의미하므로 약간 까다 롭습니다.하지만 모방 할 수는 있지만 문제는 아닙니다.jmockit으로 중첩 클래스의 생성자를 모의 처리하는 방법

그러나 이제는 ResultReceiver의 하위 클래스 인 중첩 클래스에서 메서드를 테스트하려고합니다. 이 클래스는 Fragment에 중첩되어 있습니다. 문제는이 중첩 된 클래스를 만들 때 그 생성자가 예외를 발생시키기 때문에 조롱하고 싶다는 것입니다 (해당 스텁입니다). 나는 코드를 분리하려고 노력했으나 문제는 안드로이드가 아니라 클래스 구조와 관련이있다. 예 :

기본 클래스 :

public class JM_base { 
    int m_i; 

    public JM_base(int i) { 
    m_i = i; 
    } 
} 

중첩 클래스 :

public class JM_nested_class_cons { 
    public class Nested extends JM_base { 
    public Nested(int i) { 
     super(i); 
    } 
    public void methodToTest() { 
     System.out.print("System under test!"); 
    } 
    } 
} 

시험 : 지금까지 내가 이해

public class Test_JM_nested_class_cons { 
    @Mocked JM_nested_class_cons mock; 

    @Test 
    public void test() { 
    new MockUp<JM_nested_class_cons.Nested>() { 
     @Mock public void $init(int i) { 
     System.out.println("Hi!"); 
     } 
    }; 

    JM_nested_class_cons.Nested t = mock.new Nested(1); 
    t.methodToTest(); 
    } 
} 

, 중첩의 "진짜"생성자 () 전화해서는 안됩니다. "안녕!" 콘솔에 표시되어야합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까 ?

들으

답변

3

여기에 문제가 있음을 MockUp 취급 정기적, 비 내부 클래스로 JM_nested_class_cons.Nested. 따라서 각 생성자가 외부 객체에 대한 숨겨진 첫 번째 매개 변수를 가지고 있다는 점을 고려하지 않았습니다 (JM_nested_class_cons).

업무와 주변 명시 적으로 내부 클래스의 생성자에 대한 @Mock 방법이 추가 매개 변수를 선언하는 것입니다 : 내가 중첩 된 클래스의 생성자를 차단하는 방법을 참조

@Mock 
void $init(JM_nested_class_cons outer, int i) { 
    System.out.println("Hi!"); 
} 
+0

좋아. 그러나 문제는 constructor Nested (int i)가 호출되기도하고 이것이 피하고 싶다는 것입니다. 어쨌든 JM_base를 조롱하고 문제를 해결할 수 있습니다. 감사! –

관련 문제