2008-09-01 69 views
14

我開發了一些具有類似行爲的類,它們都實現了相同的接口。我實現了一個創建適當對象並返回接口的工廠。我正在爲工廠寫一個單元測試。你所得到的只是對象的一個​​接口。 測試工廠工作正常的最佳方法是什麼?在單元測試中檢查工廠的結果

我想知道Java中的答案,但是如果有跨語言的解決方案,我想知道它。

數字2.在答案中,會像其他答案一樣完成?如果是這樣,我將標記另一個接受的答案,並重新說明我的問題,以同時爲一個接口返回的工廠和你不知道具體類實現接口的類型,以及知道具體類是什麼的情況用過的。

回答

16

因爲我不知道你的工廠方法的樣子做的,所有我現在可以告訴是

  1. 檢查看對象是你要找的正確的具體落實:

    IMyInterface fromFactory = factory.create(...); 
    Assert.assertTrue(fromFactory instanceof MyInterfaceImpl1); 
    
  2. 您可以檢查工廠是否使用有效的實例變量設置具體實例。

0
if (myNewObject instanceof CorrectClass) 
{ 
    /* pass test */ 
} 

更新:

不知道爲什麼,這引起了下調,所以我將展開它有點...

public void doTest() 
{ 
    MyInterface inst = MyFactory.createAppropriateObject(); 
    if (! inst instanceof ExpectedConcreteClass) 
    { 
     /* FAIL */ 
    } 
} 
+4

它被標記爲'因爲你應該使用聲明而不是測試... – Nicolas 2008-10-23 10:46:44

0

@ CEM-catikkas我認爲比較getClass()。getName()值會更加正確。在MyInterfaceImpl1類是子類的情況下,您的測試可能會被破壞,因爲子類是instanceof MyInterfaceImpl1。我會改寫如下:

IMyInterface fromFactory = factory.create(...); 
Assert.assertEquals(fromFactory.getClass().getName(), MyInterfaceImpl1.class.getName()); 

如果你覺得這可能以某種方式(我無法想象)失敗,使兩個驗證。

+0

我同意,但我不認爲檢查類名稱的平等是多餘的。只要檢查課程應該足夠好。 – 2008-09-16 03:52:06

+1

爲什麼要測試一個來自Class的方法返回一個相等的值,而不是直接比較Class對象? – jdmichal 2008-11-17 14:55:20

20

你所試圖做的是不是單元測試

如果測試返回的對象是否是特定的,具體類的實例,你是不是單元測試。你是集成測試。雖然集成測試很重要,但這不是一回事。

在單元測試中,您只需要測試對象本身。如果在返回的抽象對象的具體類型上聲明,那麼您正在測試返回對象的實現。在對象

單元測試一般

在單元測試中,有四件事情,你要斷言:

  1. 查詢的返回值是你所期望的是什麼(非空的方法)是。
  2. 命令的副作用(void方法)按照您的預期修改對象本身。
  3. 命令發送到其他對象收到(這通常使用模擬)。

此外,您只想測試從對象實例(即公共接口)中可以觀察到什麼。否則,你將自己綁定到一組特定的實現細節。這將要求您在這些細節更改時更改您的測試。

單元測試工廠對工廠

單元測試真的是索然無味,因爲你不感興趣的查詢返回的對象的行爲。這種行爲(希望)可以在其他地方進行測試,可以推測,而單元測試則是對象本身。你只是真正感興趣的是返回的對象是否有正確的類型,這是保證如果您的程序編譯。

由於工廠不會隨着時間而改變(因爲那時它們會是「建造者」,這是另一種模式),所以沒有命令可以測試。

工廠負責實例化對象,所以他們不應該依賴其他工廠爲他們做這件事。他們可能依賴於一個Builder,但即便如此,我們也不應該測試Builder的正確性,只有Builder是否接收到該消息。

這意味着您需要在工廠上測試的所有內容都是他們是否將消息發送到他們所依賴的對象。如果你使用依賴注入,這幾乎是微不足道的。只是嘲笑單元測試中的依賴關係,並驗證它們是否收到消息。

彙總單元測試工廠的

  1. 不要測試的行爲,也沒有返回的對象的實現細節!您的工廠不負責執行對象實例!
  2. 測試是否收到發送給依賴項的命令。

就是這樣。如果沒有依賴關係,就沒有什麼可以測試的。除了可能斷言返回的對象不是null參考。

集成測試工廠

如果你有一個要求,即返回的抽象對象類型是一個特定的具體類型的實例,那麼這屬於下集成測試。

此處的其他人已經回答瞭如何使用instanceof運算符來完成此操作。