![](/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.