【问题标题】:how to properly test the methods defined in the Main class by using JUnit?如何使用 JUnit 正确测试 Main 类中定义的方法?
【发布时间】:2021-12-28 21:31:19
【问题描述】:

我是 Java 新手,所以这可能是一个幼稚的问题。我创建了一个Main 类,如下所示,我想为getArraysgetAveragebubbleSortAscending 方法编写一些测试,只是为了学习如何进行单元测试。

public class Main {
        private static final Scanner scanner = new Scanner(System.in);
        public static void main(String [] args) {
            int[] myArrays = getArrays(5);
            for (int i=0; i<myArrays.length; i++) {
                System.out.println("index = " + i + " value = " + myArrays[i]);
            }

            System.out.println("Average is " + getAverage(myArrays));

            int[] sortedArray = bubbleSortAscending(myArrays);
            System.out.println("Sorted: \r");
            for (int i=0; i<sortedArray.length; i++) {
                System.out.println(sortedArray[i]);
            }
        }

        public static int[] getArrays(int number) {
            System.out.println("Enter " + number + " integer values.\r");
            int[] values = new int[number];

            for (int i=0; i<values.length; i++){
                values[i] = scanner.nextInt();
            }
            return values;
        }

        public static double getAverage(int[] array) {
            double sum = 0;
            for (int i=0; i<array.length; i++){
                sum += array[i];
            }
            return sum / (double) array.length;
        }

        public static int[] bubbleSortAscending(int[] array) {
            for (int i=0; i<array.length-1; i++){
                for (int j=0; j<array.length - i - 1; j++){
                    int a = array[j];
                    int b = array[j+1];
                    if (a > b) {
                        int c = a;
                        a = b;
                        b = c;
                    }
                    array[j] = a;
                    array[j+1] = b;
                }
            }
            return array;
        }

    }

而 IntelliJ 自动为我生成了这些测试代码:

public class MainTest {

    @org.junit.Test
    public void getArrays() {
    }

    @org.junit.Test
    public void getAverage() {
    }

    @org.junit.Test
    public void bubbleSortAscending() {
    }

}

但是,当我用这样的代码填充第一个时:

 @org.junit.Test
    public void getArrays() {
        int[] expectedArray = new int[]{1,2,3,4,5};
        int[] generatedArray = getArrays(5);
        assertArrayEquals(expectedArray, generatedArray);
    }

IntelliJ 告诉我出了点问题...

看起来是因为MainTest 中的getArrays() 没有接受任何输入参数?为什么MainTest 中的getArrays()Main 中定义的getArrays() 工作方式不同?

【问题讨论】:

  • 测试类中的 getArrays 是一种方法,您应该将getArrays 的单元测试放在主类中。这是他们之间唯一的关系。我认为这是不好的命名,您应该将方法重命名为您正在测试的案例,例如testGetArraysAcceptsEmptyArray。此外,由于getArrays 接受用户输入,因此很难测试,我认为您应该忽略它。当您有更多经验时,您可以将 Scanner 传递给该方法,并为您的测试提供 Scanner 的模拟实例,但现在不要陷入困境。

标签: java unit-testing methods junit junit4


【解决方案1】:

问题在于您正在递归调用(错误地)测试方法本身,而该测试方法恰好与测试方法具有相同的方法名称。

测试方法 (MainTest.getTest()) 与测试方法 (Main.getTest(int)) 不同,它没有任何参数 - 因此出现错误消息,您无法将 int 传递给该方法。

你必须通过指定类来调用被测试的静态方法:

@Test
public void getArrays() {
   ...
   int[] generatedArray = Main.getArrays(5); // Call getArrays(int) in Main class
   ...
}

或者改变方法名,你可能会有不止一种测试方法:

@Test
public void getArraysReturnsNull() { ... }
// OR
@Test
public void testGetArrays() { ... }
...

现在您可以使用静态导入并调用已测试的静态方法而无需对类进行分类:

import static segovia.java.learn.Main.getArrays;

@Test
public void testGetArrays() {
   int[] generatedArray = getArrays(); // OK now
}

IntelliJ 提示

按住 CTRL 并单击方法名称。

【讨论】:

  • 谢谢!它现在对我有用。所以吸取的教训是,我不会盲目地使用IDE自动生成的代码。
猜你喜欢
  • 1970-01-01
  • 2021-05-02
  • 2021-02-17
  • 1970-01-01
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
相关资源
最近更新 更多