簡體   English   中英

如何使用 JUnit 正確測試主 class 中定義的方法?

[英]how to properly test the methods defined in the Main class by using JUnit?

我是 Java 的新手,所以這可能是一個幼稚的問題。 我創建了一個Main class 如下所示,我想為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() getArrays()Main中定義的 getArrays() 工作方式不同?

問題是您遞歸調用(錯誤地)測試方法本身,它恰好與測試方法具有相同的方法名稱。

與測試方法( MainTest.getTest() Main.getTest(int) )相反,測試方法( MainTest.getTest() )沒有任何參數 - 因此出現錯誤消息,您無法將int傳遞給該方法。

您必須通過指定 class 來調用經過測試的 static 方法:

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

或更改方法名稱,無論如何您可能會有不止一種測試方法:

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

現在您可以使用 static 導入並調用經過測試的 static 方法,而無需對 class 進行分類:

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

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

IntelliJ 提示

按住 CTRL 並單擊方法名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM