2013-03-20 41 views
2

我寫作單元測試&新一邊寫測試用例下面的情形我卡住了:如何編寫針對一組方法的單元測試,其中每個方法都依賴於其他方法?

Class A 
{ 
    public B createB(string name); 
    public B getB(string name); 
    public void removeB(B instance); 
} 

Class B 
{ 
    public B(string name); 
} 

方法createB()將其是否具體名字已經存在的B實例返回null。因此,測試createB()成功完成的情況下,我已經打電話給getB()檢查,如果再存在removeB()將其刪除:

A a = getInstanceOfA(); 
public void testCreateB() 
{ 
    B b = a.getB("B"); 
    if (b != null) 
    { 
     a.removeB(b); 
    } 
    assertNotNull(a.createB("B")); 
} 

這違反測試案例」的規則必須失敗只有一個原因「,如果測試失敗,我不知道問題來自哪裏。測試getB()方法是一樣的,createB()必須被稱爲開始測試的先決條件。我使用JUnit,每次開始測試時,測試用例都會被洗牌。在這種情況下是否有最佳做法來確保測試用例的隔離?

另外需要注意的是,getInstanceOfA()方法是從另一個庫提供的API調用,並且不可控制得到'乾淨'實例A

回答

1

您需要將程序置於字符串「B」的已知狀態,使用「B」調用createB方法並檢查結果是您期望的結果。然後你再次這樣做,以不同的狀態和不同的預期結果。就像這樣:

public void testCreateBSucess() { 
    A a = getInstanceOfA(); // Make sure "B" doesn't exists 
    B b = a.createB("B"); 
    assertNotNull(b); 
} 

public void testCreateBFail() { 
    A a = getInstanceOfA(); 
    a.createB("B"); // Making sure "B" exists 
    B b = a.createB("B"); 
    assertNull(b); 
} 
1

看一看像一些的Mockito模擬框架,這將使由開發商控制的其他功能的一些模擬的反應,你可以測試只是所需的功能。

0
  • 嘗試使用JUnit 4註釋,如@Before@After與您的方法。
  • 或者只寫一個複雜的長測試。有很多情況下,如果您不能在不違反通用測試規則的情況下編寫測試,則無法編寫測試。沒關係。如果你真的需要,可以寫一個很長的測試。
相關問題