![](/img/trans.png)
[英]How do we write unit tests for methods which involves connection with DB?
[英]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.