Java 如何为调用其他方法的方法编写单元测试?

Java 如何为调用其他方法的方法编写单元测试?,java,unit-testing,Java,Unit Testing,这是一个非常糟糕的代码示例。很抱歉。 我想为我的方法编写一个单元测试。这只调用其他方法并返回字符串str1。我不认为有任何需要测试这段代码 public class MyClass{ private String str1; private String str2; private void m1(){..} private String m2(){ // do something return someString;

这是一个非常糟糕的代码示例。很抱歉。 我想为我的方法编写一个单元测试。这只调用其他方法并返回字符串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你观察行为。您为您的测试类创建一个对象,然后调用方法;然后在返回的值上断言

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"));
}
那个对空输入进行不同的检查

因此,你通过所有有意义的输入来工作。当然,这里的想法是,可以通过这种方式检查受测类的所有可能行为。如果还有其他人参与进来,你当然要考虑他们。但理想情况下,情况不应如此:您应该设计所有代码,以便尽可能轻松地对其进行全面测试;理想情况下,无需编写任何其他内容,只需编写此类测试。

我完全同意:

[…]最好的单元测试是那些只检查被测试代码的可观察行为的测试

因此,只测试您的类的公共契约

然而,在很少的情况下,您可能需要测试私有方法,例如,如果您使用的是遗留代码。一种方法是:

PowerMockito.verifyPrivatecut.invokem1; 其中cut是cut–MyClass的一个实例

检查这些问题以获取进一步的意见和参考:


我认为没有必要测试这个[私有方法]

对。对

私有的方法不需要任何直接测试。当然,私有方法应该是私有的,但是由于它们是私有的,并且不是公开API的一部分,所以不需要像公共方法那样直接测试它们


本书概述了有效使用JUnit的许多策略。实现TDD是确保类的非公共功能在测试中得到充分覆盖的一种方法。也就是说,首先编写单元测试,然后实现类以通过这些测试。这样,您只需编写测试定义的所需功能。

谢谢您的回复。我编辑了这篇文章。现在,m2返回一些字符串。所以我试图检查Assert.assertNotNullstr1以检查myMethod是否返回null。但是它给出了java.lang.NullPointerException,因为m1和m2实际上没有被调用。