如何使用 JUnit 正确测试 Main class 中定义的方法?
how to properly test the methods defined in the Main class by using JUnit?
我是 Java 的新手,所以这可能是一个幼稚的问题。我创建了一个如下所示的 Main
class,我想为 getArrays
、getAverage
和 bubbleSortAscending
方法编写一些测试,只是为了这个目的学习如何进行单元测试。
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()
不一样?
问题是您正在(错误地)递归调用测试方法本身,该方法恰好与测试方法具有相同的方法名称。
测试方法 (MainTest.getTest()
),与测试方法 (Main.getTest(int)
) 相反,它没有任何参数 - 因此出现错误消息,您无法传递 int
那个方法。
您必须通过指定 class:
来调用测试的静态方法
@Test
public void getArrays() {
...
int[] generatedArray = Main.getArrays(5); // Call getArrays(int) in Main class
...
}
或者更改方法名称,反正你可能会有不止一种测试方法:
@Test
public void getArraysReturnsNull() { ... }
// OR
@Test
public void testGetArrays() { ... }
...
现在您可以使用静态导入并调用经过测试的静态方法而无需分类 class:
import static segovia.java.learn.Main.getArrays;
@Test
public void testGetArrays() {
int[] generatedArray = getArrays(); // OK now
}
IntelliJ 技巧:
按住 CTRL 并单击方法名称。
我是 Java 的新手,所以这可能是一个幼稚的问题。我创建了一个如下所示的 Main
class,我想为 getArrays
、getAverage
和 bubbleSortAscending
方法编写一些测试,只是为了这个目的学习如何进行单元测试。
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()
不一样?
问题是您正在(错误地)递归调用测试方法本身,该方法恰好与测试方法具有相同的方法名称。
测试方法 (MainTest.getTest()
),与测试方法 (Main.getTest(int)
) 相反,它没有任何参数 - 因此出现错误消息,您无法传递 int
那个方法。
您必须通过指定 class:
来调用测试的静态方法@Test
public void getArrays() {
...
int[] generatedArray = Main.getArrays(5); // Call getArrays(int) in Main class
...
}
或者更改方法名称,反正你可能会有不止一种测试方法:
@Test
public void getArraysReturnsNull() { ... }
// OR
@Test
public void testGetArrays() { ... }
...
现在您可以使用静态导入并调用经过测试的静态方法而无需分类 class:
import static segovia.java.learn.Main.getArrays;
@Test
public void testGetArrays() {
int[] generatedArray = getArrays(); // OK now
}
IntelliJ 技巧:
按住 CTRL 并单击方法名称。