2015-10-05 71 views
1

類結構看下面喜歡:如何在Junit中模擬子類的構造函數?

class A { 
protected String a; 
protected String b; 

A(String b1) { 
    new A("A111", b1); 
} 

A(String a1, String b1) { 
    a = a1; 
    b = b1; 
} 
} 

class B extends A { 

    B(String b) { 
    super("A", b); 
    } 
} 

我需要編寫JUnit測試案例,需要嘲笑構造爲A類,以便每當對象爲B類需要創建A類,然後模擬構造應該得到調用和從模擬構造函數返回對象。

我嘗試以下操作:

 new MockUp<A>() { 

      @Mock 
      public void $init(String b1) { 
       new A("A11111111", b1); 
      } 
     }; 

但在嘲笑構造函數創建的對象沒有得到回報。

+0

我不明白你的要求。你能解釋一下你想做什麼以及想要測試什麼嗎? – Tunaki

+0

看起來好像你想將超類構造函數從子類中分離出來,並且只測試子類的邏輯(通過模仿超類)?但事情是這樣的:構造函數不會真的返回對象 - 當你調用super()時,你不會將它分配給任何東西,因爲它在'this'上運行......所以你不能「調用並返回對象從模擬構造函數「在這種情況下。 – dcsohl

+0

我想模擬單參數化構造函數和模擬構造函數,我想創建使用兩個參數化構造函數的對象,並返回相同的對象供進一步使用。 – Abhishek

回答

1

好吧,你是在正確的道路上......它需要的@MockMockUpInvocationDeencapsulation組合......你要添加一個Invocation$init模擬方法,然後用Deencapsulation閒逛在A內部。這是一個例子。我使用了你的A和B類,只是將它們清理一些,並添加getters以便於使用。我故意沒有添加setter,所以我可以炫耀如何解決缺乏setter的問題。

package com.example.dcsohl; 

import org.junit.Test; 

import mockit.Deencapsulation; 
import mockit.Invocation; 
import mockit.Mock; 
import mockit.MockUp; 

public class TestTest { 

    public static class A { 
     protected String a; 
     protected String b; 

     public A(String b1) { 
      this("A111", b1); 
     } 

     public A(String a1, String b1) { 
      a = a1; 
      b = b1; 
     } 
    } 

    public static class B extends A { 
     public B(String b1) { 
      super("A", b1); 
     } 

     public String getA() { 
      return this.a; 
     } 

     public String getB(){ 
      return this.b; 
     } 
    } 

    @Test 
    public void test() { 
     new MockUp<A>() { 
      @Mock public void $init(Invocation inv, String a1, String b1) { 
       A a = inv.getInvokedInstance(); 
       Deencapsulation.setField(a, "b", b1); 
      } 
     }; 

     B b = new B("foo"); 

     System.out.println(b.getA()); 
     System.out.println(b.getB()); 

    } 

} 

你會注意到,在年底,打印證明我成功設置的b的價值,但是,不捨a獨自一人,它出來作爲null

+0

感謝您的建議並提供解決方案。它工作順利! – Abhishek

相關問題