0

我有一些在类示例中是私有的方法,我想在测试类中使用它们来进行测试,如何访问这些方法并将它们保留为私有

import java.util.*;

public class Example
{
      Scanner scanner;
    public Example()
    {
       scanner = new Scanner(System.in);
    }
    private void enterName()
    {
        System.out.println("Enter name");
        String name = scanner.nextLine();
        System.out.println("Your name is: " + name);
    }
    private void enterAge()
    {
         System.out.println("Enter age");
        int age = scanner.nextInt();
        System.out.println("Your age is : " + age); 
    }
    public void userInput()
    {
        enterAge();
        enterName();
    }
}


public class Test
{

  public static void main(String args[])
  {
      Example n = new Example();
      n.enterName();
      n.enterAge();
    }

}
4

2 回答 2

2

为什么要测试私有方法而只使用公共方法?单元测试是关于测试预期行为。公共方法公开该行为。

如果你想测试生成的输出,你可以实现一个受保护的方法来写入,out例如

public class Example {

    // code omitted 

    private void enterName() {
        writeMessage("Enter name");
        String name = scanner.nextLine();
        writeMessage("Your name is: " + name);
    }

    protected void writeMessage(String msg) {
        System.out.println(msg);
    }
}

然后,在您的测试中,您可以创建一个扩展Example并覆盖writeMessage方法的私有类。

public class ExampleTest {

    public testOutput() {
        MyExample e = new MyExample();
        e.userInput();

        String output = e.getOutput();

        // test output string
    }

    private class MyExample extends Example {
        private String output = "";

        public String getOutput() {
            return output;
        }

        @Override
        public void writeMessage(String msg) {
            output += msg;
        }
    }
}

您可能还需要一个可以注入Scanner对象的 setter 或构造函数。这将使测试更容易,因为您可以注入模拟的扫描仪版本。

于 2013-10-29T18:52:52.447 回答
0

单元测试确实是黑盒测试,因此您不能也不应该访问私有(内部机制)方法。然而,白盒测试通常被称为基于断言的验证。只需将断言(或 it-then-throw 语句)放在任何地方,您的黑盒单元测试就会变成白盒测试。

更具体地说,尝试在您的私有方法中尽可能多地放置前置条件和后置条件,以验证输入和输出。因此,您在每个方法调用者和被调用者之间定义了一个契约。如果出现问题,您将很快了解出问题的位置和原因。

有关更多信息,请参阅按合同设计

于 2013-10-29T19:13:51.543 回答