簡體   English   中英

Junit:局部變量和void方法

[英]Junit: local variables and void methods

我對單元測試還很陌生,並且已經在線閱讀了很多材料,但是在弄清內容方面有些麻煩。

例如:如果我有以下代碼:

public class RandomClass
{
  int a = 4;
  public void foo(Object obj)
  {
    if(a == 4)
    {
      AnotherObject anotherObj = new AnotherObject();
      anotherObj.setAttribute(obj.getFiled());
      //Method call that will be suppressed 
      Anotherclass.anotherMethod(anotherObj);
    } 
  }
}

我想到寫這樣的junit測試用例:

@Test
public void testFoo()
{
  int a=4;
  RandomClass randomClass = new RandomClass();
  Object object = new Object();
  object.setField("hey");
  randomClass.foo(object);
}

我在這里有幾個問題。 我如何從我的junit設置整數a? 我現在設置的方式不會對單元測試用例產生任何影響。 當我調試單元測試時,a的值為NULL,因此它永遠不會通過if條件!

另外,方法foo返回一個void,所以我可能會測試/聲明什么?

編寫單元測試時,有兩種主要技術:

  1. 檢查被測課程的外部合同。 含義:您嘗試編寫測試用例RandomClass一無所知 AnotherClass。 而是,您的測試代碼僅觀察RandomClass對象的行為。 換句話說:您實際上並不在乎RandomClass的內部實現細節-因為您可以通過檢查在調用具有特定參數的方法時返回的RandomClass對象返回來觀察所有“想要看到的東西”。 有時候,您可以通過添加(受程序包保護的)getter方法到達那里,該方法允許您檢查被測類的某些內部狀態。
  2. 但是有時候這可能還不夠“好”。 例如,當您知道被測類必須使用其他對象才能完成其工作時。 在這種情況下,您應該研究模擬對象。 在您的情況下,您可能想要創建AnotherClass的模擬實例; 然后您將使用依賴注入以將該對象提供給您的受測類。

您會看到,您實際上編寫了“難以測試”的代碼-因為您在生產代碼中為AnotherClass調用了new 這似乎沒什么大不了,但是取決於AnotherClass是關於什么的……您真的不應該這樣做!

任何狀況之下; 我建議您觀看這些視頻,以學習如何編寫更適合單元測試的代碼。

測試通常從“設置”,“准備”或“安排”步驟開始,在該步驟中,將創建或修改被測對象,使其處於該特定測試所需的狀態。

因此,如果RandomClass對象中的字段a需要具有值4 (例如),則測試需要創建將該值作為構造函數參數傳遞的對象, 或者通過調用setter方法在該對象中設置值或直接訪問該字段。 在最壞的情況下,您可能需要使用Reflection來設置字段,但這將指示正在測試的類中存在設計問題。

下一步是測試代碼。 這是“安排,行動,聲明”術語(簡稱AAA)中的“行動”步驟。

最后,最后一步是“聲明”(驗證)所測試的代碼是否按照預期執行。

如果所測試的方法具有void返回類型,則測試應通過狀態驗證或行為驗證來驗證其是否達到了預期的效果。

在第一種情況下,測試將在被測對象中調用某種getter方法,並將其用於某種類型的“斷言”(例如assertEquals(expectedValue, actualValue) )。

在第二種情況下,測試將使用一些模擬庫,以驗證預期的調用是從被測代碼對一個或多個依賴項(被測類所依賴的其他對象或類)進行的。 例如,這里的測試可以驗證RandomClass#foo是否確實調用了Anotherclass.anotherMethod(...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM