2012-06-08 77 views
0

我如何測試在SomeClass中動態創建的這個ValueObject,而不使用PowerMock等進行存根?如何在單元測試時獲取新對象的句柄?

class ValueOBject { 
    private String x, y; 
    getters 
    setters 
} 
class SomeClass { 
    public void foo() { 
     ValueObject vo = new ValueObject(); 
     vo.setX("some string 1"); 
     vo.setY("some string 2"); 

     faa(vo); 
    } 

    public void faa(ValueObject vo) { 
     // do some more logic on vo here 
    } 
} 


class SomeClassTest extends TestCase{ 
    public void testFoo() { 
     SomeClass s = new SomeClass(); 
     s.foo(); 
     // HOW TO DO THIS? 
     verify(faa(VAlueObject that is created during foo's run)); 
    } 
} 

我不想使用PowerMockito或類似的庫返回一個對象嘲笑! 相反的真實對象那是實際方法foo()的執行期間創建的:

// DONT WANT A MOCKED OBJECT 
// @Mock 
// private ValueOBject vo; 
//  henNew(GetEmailInformation.class).withNoArguments().thenReturn(getEmailInformation); 
+0

訪問者會有幫助嗎? – chessofnerd

回答

0

這是告訴您,設計具有緊耦合,所以也許注入對象進入方法來代替。

+0

我無法解耦對象作爲其遺留代碼 – user1445031

0

您可能需要考慮在foo()中測試faa()。從OOP的角度來看,我寧願foo()的調用者也不需要知道faa()即使存在。 faa()需要公開嗎?

+0

特別是 - faa和foo都受到保護 – user1445031

+0

在查看您的代碼後,我感到有點困惑。 'faa()'和'foo()'都會返回void,並且不會在'SomeClass'中存儲'vo'。據我所知,任何人都不可能獲得'vo'(這甚至包括'SomeClass',因爲它不存儲對象。你是否想在測試類中創建'vo'並將它傳遞給' foo()'?當'foo()'返回時,它看起來像你正在失去'vo'(它將被垃圾回收器刪除)。 – chessofnerd

1

ValueObject是內部創建的,所以它只能依賴於對象狀態。你不需要測試內部部件,你只需要測試你所做的調用的副作用。

在這種情況下,您不需要測試foo,因爲您知道foo做什麼,它只是faa的包裝。因此,您需要測試faa中由全局狀態和ValueObject輸入引起的操作和副作用。

如果您想測試foo()是否符合您的期望,那麼您必須測試foo()引起的副作用與faa(expectedObject)具有的相同。換句話說:如果foo和faa是公共的,並且公共接口說foo是faa的一個包含固定參數的包裝器,那麼您需要測試foo是否完全使用您期望的固定參數進行的操作。

1

因此,它看起來像你想要在foo()中創建的ValueObject聲明並傳遞到faa(vo)

創建單元測試實例化預期的ValueObject並將其傳遞到faa(vo)。然後將此結果與您剛剛撥打foo()時發生的結果進行比較。

例如:

// in your unit test: 
ValueObject testVo = new ValueObject(); 
// set values as needed 
// testVo should represent what you expect the ValueObject instantiated by foo to 
// hold *before* it gets passed to faa 

faa(testVo); 
// assertions against results of faa method 

foo(); 
// assertions *comparing* the results of foo with the results of your manual faa 

因此,舉例來說,如果我希望foo創建的ValueObject與X = 1和Y = 1,然後faa做他們的魔法,使得的ValueObject的最終結果是X = -1,Y = 2,單元測試將是這個樣子:

ValueObject testVo = new ValueObject(); 
testVo.setX(1); 
testVo.setY(1); 

faa(testVo); 
// assertions using your testing library of choice to verify getX() returns -1 and 
// getY() returns 2 

foo(); 
// assertions that the end values after foo()'s faa call are -1 and 2 respectively 

現在在你的上面虛擬的例子,無論是foofaa都是無效的方法,所以沒有返回值。我假設faa實際上確實東西是可測試的 - 例如。設置字段,更改值等。

在其他答案中留下的一些評論中,您記下了您有一些涉及私人和/或受保護的字段和方法。如果是這種情況,您需要查看Java reflection以瞭解如何檢索這些值。

但是,在傳遞給faa(vo)之前,爲了明確地取出在foo()內實例化的ValueObject,這是不可能的。如上所述,您最好的選擇是測試您對ValueObject的行爲預期,您希望期望foo()中創建,並將它傳遞給faa(vo)的結果與實際發生的情況進行比較。

相關問題