2013-03-19 38 views
1

我嘲笑了使用PowerMock/Mockito的私有方法,現在我的問題是如何訪問在此方法中聲明的對象?例如如何訪問私有方法內的對象?

private void method1() 
{ 
MyObject ob = new MyObject(); 

} 

現在在我的測試代碼,我要訪問的OB對象來驗證值。

+0

我不知道,但我記得看到了一種莫名其妙嘲笑構造函數調用,並使其返回模擬對象,可以是之後檢查 – ppeterka 2013-03-19 12:46:07

+1

您可能會提供一些您正在嘗試完成的精確度。因爲在我看來,如果你想檢查私有方法的內部字段,你並沒有採用正確的方法。 – benzonico 2013-03-19 12:47:27

+0

@ppeterka:我不想修改代碼 – user2181531 2013-03-19 12:50:28

回答

1

This guide細節嘲諷使用PowerMock一個構造函數調用:

... 但隨着PowerMock你沒有更改代碼,而不是你可以指示PowerMock攔截調用新的文件(。 。)並返回一個模擬對象。通過創建類型File.class的模擬像往常一樣做到這一點,我們開始:

File fileMock = createMock(File.class); 

要想到新的文件調用,我們簡單地做:

expectNew(File.class, "directoryPath").andReturn(fileMock); 

所以你的情況,你應該在你的測試用例或設置方法有這些:

MyObject mockOb = createMock(MyObject.class); 
expectNew(MyObject.class).andReturn(mockOb); 

通過添加這些,你將有以下行爲:

每當有new MyObject()您的代碼運行測試案例,由PowerMock嘲笑的對象實例將被返回。所以沒關係其中在你的代碼中你創建了一個新的MyObject實例,它將和createMock()函數創建的實例一樣。

編輯

讓我們舉例

Class A { 
private void method1() 
{ 
    Obj obj = new Obj(); 
    obj.setX(10); 
} 
//Here I want to access the obj object to verify the values 
} 

要做到這一點,你必須考慮有一點不同。

  1. 創造真正的一個實例
  2. 設立嘲諷爲obj的構造
  3. 運行邏輯觸發pruivate method1()
  4. 檢查值在嘲笑的OBJ實例
    • 如果值是不可測試的(某些東西在邏輯中修改它),zou可以檢查setX()是否被稱爲適當的時間。

東西沿着這些路線:

@Test 
public void testMyPrivateMethod() { 
    //1. object with the logic to test 
    A a = new A(); 

    //2. set up mocking 
    Obj mockObj = createMock(Obj.class); 
    expectNew(Obj.class).andReturn(mockObj); 

    //3. trigger logic to test 
    a.someOtherMethodThatCallsMethod1(); 

    //4. test Obj (find out if setX() has been called or not) 
    verify(mockObj).setX(any(Integer.class)); 
} 
+0

我的方法不返回在創建同一個對象的值時,嘲諷 – user2181531 2013-03-19 13:02:13

+0

讓我們例如A類{私人無效方法1(){的OBJ OBJ =新的Obj(); obj.setX(10);}這裏我想訪問obj對象來驗證值 – user2181531 2013-03-19 13:02:43

+0

你的方法的返回類型是'void'。它不會返回任何東西。我不明白你寫的是什麼......你明白嘲笑的作用嗎? – ppeterka 2013-03-19 13:04:57

相關問題