2015-10-05 73 views
0

whenNew如果我有兩個構造器不能正常工作運行。在下面的代碼片段,我需要真正的構造被稱爲第二次,但我得到一個NullPointerException代替。PowerMockito whenNew不與多個構造

@RunWith(PowerMockRunner.class) 
    public class UtilTest { 

     @Test 
     public void test()throws Exception { 
      A a= new A(); 
      a.setI(10); 
      whenNew(A.class).withNoArguments().thenReturn(a); 

      UtilTest test= new UtilTest(); 
      test.testA(); 

     } 

     private void testA(){ 
      A a1= new A(); 
      System.out.println(a1.getI()); 
      A a2= new A(50); 
      System.out.println(a2.getI()); 
     } 
    } 

    class A{ 
     int i=1; 
     public A(){} 

     public A(int i){ 
      this.i=i; 
     } 

     public void setI(int i){ 
      this.i=i; 
     } 

     public int getI(){ 
      return this.i; 
     } 
    } 

輸出 -

10 
java.lang.NullPointerException 
+0

** 1)**除非我加上'@PrepareForTest(UtilTest.class)'會成功打印10 50 ** 2)**如果你不關心它的構造函數被調用,然後使用'whenNew(A.class).withAnyArguments()。thenReturn(a);'。 ** 3)**如果你關心的構造函數,然後定義每個的那麼值** 4)**否則會給我們一些背景,因爲這是一個有點奇怪的理解,爲什麼和你需要什麼。 – Morfic

+0

對不起,@Morfic如果我不夠清楚。我的預期輸出爲10和50。1) - 它會給1 50 2)3)我不關心哪個構造嘲笑。 4)我的目的是嘲笑構造函數沒有參數,但沒有其他人。對象創建的部分模擬,不知道是否有可能。 – shashankaholic

+0

不知道這是可能的,但除非我失去了你的觀點,你應該能夠嘲笑你的** A **,並返回10,然後50'格提()'。大致如下:'A mockA = mock(A.class);當(mockA.getI())。然後返回(10,50); whenNew(的A.class).withAnyArguments()thenReturn(mockA);'。不要忘了'@PrepareForTest(UtilTest.class)' – Morfic

回答

0

(1)保持的newInstance類(int)方法類操作之前

(2)嘗試以限定兩個構造。

whenNew(A.class) 
    .withNoArguments() 
    .thenReturn(a); 
whenNew(A.class) 
    .withArguments(...) 
    .doAnswer(call original constructor); 
+0

不會與構造函數一起使用withArguments – shashankaholic

+0

doCallRealMethod不適用於whennew – shashankaholic

+0

最後的機會:私有構造函數+靜態工廠方法 – ursa