2013-11-03 230 views
2

我正在嘗試使用JMockit進行Android應用程序的單元測試。由於在本地JVM中執行測試意味着所有的Android類都是存根,所以這有點棘手,但是你可以嘲笑它們,這不是問題。如何使用jmockit模擬嵌套類的構造函數

但是現在我想測試一個嵌套類中的方法,它是ResultReceiver的子類。這個類嵌套在Fragment中。問題是當我創建這個嵌套類時,我想嘲笑它的構造函數,因爲它會引發一個異常(它是一個存根)。我試圖隔離代碼,但問題不在Android中,而是在類結構中。例如:

基類:

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(); 
    } 
} 

據我明白,嵌套的 「真正的」 構造( )永遠不應該被稱爲,「嗨!」應該出現在控制檯中,對嗎?我究竟做錯了什麼 ?

THX

回答

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

好吧,我看到如何攔截嵌套類的構造函數。但問題是構造函數Nested(int i)也被調用,這就是我想避免的。無論如何,我可以嘲笑JM_base並解決問題。謝謝! –