簡體   English   中英

如何為調用其他方法的方法編寫單元測試?

[英]How to write unit tests for method which calls other methods?

這是一個非常糟糕的代碼示例。 對於那個很抱歉。 我想為myMethod()寫一個單元測試。 這僅調用其他方法並返回String str1。 我看不到需要測試此代碼。

public class MyClass{
    private String str1;
    private String str2;

    private void m1(){..}
    private String m2(){  
         // do something
        return someString;

    }
    public String myMethod(String s1){
      str2 = s1;
      m1();
      str1 = m2();
      return str1;
    }
}

有多種編寫單元測試的方法。

A)您觀察行為。 您創建要測試的類的對象,然后調用方法。 然后你assertThat上返回的值。

B)當您的對象使用其他對象時,則可能必須轉向模擬框架,例如,以驗證您是否看到了對這些對象的預期方法調用。

在您的情況下,這實際上取決於m1 / m2在做什么。 如前所述-最好的單元測試是那些檢查被測代碼的“可觀察”行為的單元測試。 像那些例子:

@Test(expected=NullPointerException.class)
public void testMyMethodWithNull() {
  new MyClass().myMethod(null);
}

上面將檢查以null調用您的方法時...拋出NPE。

@Test
public void testMyMethodWithEmptyString() {
  MyClass underTest = new MyClass();
  assertThat(underTest.myMethod(""), is("some expected string for empty input"));
}

那個為空輸入做了一些不同的檢查。

這樣,您便可以通過所有有意義的輸入來工作。 當然,這里的想法是可以用這種方法檢查被測類的所有可能的行為。 如果還有其他因素在起作用,那么您當然必須考慮它們。 但是理想情況下並非如此:您應該設計所有代碼,以便盡可能容易地對其進行全面測試; 理想情況下,除了此類測試外,無需編寫其他任何內容。

我完全同意GhostCat

[…]最好的單元測試是那些僅檢查被測代碼的“可觀察”行為的單元測試。

因此,僅測試您被測課程(CUT)的公共合同。

但是,在極少數情況下,您可能需要測試私有方法,例如,如果您正在使用舊版代碼。 一種方法是使用PowerMockito

PowerMockito.verifyPrivate(cut).invoke("m1");

cut是您的CUT – MyClass的實例。

請查看以下問題,以獲取進一步的意見和參考:

“我認為沒有必要測試這種[私有方法]。”

是。 那就對了。

私有方法不需要任何直接測試。 當然,私有方法應該包括在內 ,但是由於它們是私有的,並且不是公開API的一部分,因此不需要像public方法一樣直接對其進行測試。

本書《 JUnit在行動:第二版》概述了有效使用JUnit的許多策略。 實施TDD是確保測試很好地覆蓋類的非公共功能的一種方法。 也就是說,你寫你的單元測試然后再你實現你的類來通過這些測試。 這樣,您只需編寫測試定義的所需功能。

暫無
暫無

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

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