繁体   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