我正在独自学习CS61B-UCB,并且是使用IntelliJ和Junit4.12的初学者。我发现my org.junit.Assert.assertArrayEquals()
在视频中有类似这样的节目
在“运行”窗口中。
这是TestSort.java的代码
import static org.junit.Assert.*;
import org.junit.Test;
/** Tests the the Sort class. */
public class TestSort {
/** Test the Sort.sort method. */
@Test
public void testSort() {
String[] input = {"i", "have", "an", "egg"};
String[] expected = {"an", "egg", "have", "i"};
Sort.sort(input);
if (input != expected)
{
System.out.println("something wrong!");
}
org.junit.Assert.assertArrayEquals(expected, input);
}
@Test
public void testFindSmallest() {
String[] input = {"i", "have", "an", "egg"};
int expected = 2;
int actual = Sort.findSmallest(input, 0);
assertEquals(expected, actual);
String[] input2 = {"there", "are", "many", "pigs"};
int expected2 = 2;
int actual2 = Sort.findSmallest(input2, 2);
assertEquals(expected2, actual2);
}
@Test
public void testSwap() {
String[] input = {"i", "have", "an", "egg"};
int a = 0;
int b = 2;
String[] expected = {"an", "have", "i", "egg"};
Sort.swap(input, a, b);
assertArrayEquals(expected, input);
}
}
这是Sort.java的代码
public class Sort {
public static void sort(String[] x) {
sort(x, 0);
}
private static void sort(String[] x, int start) {
if (start == x.length) {
return;
}
int smallestIndex = findSmallest(x, start);
swap(x, start, smallestIndex);
sort(x, start + 1);
}
public static void swap(String[] x, int a, int b) {
String temp = x[a];
x[a] = x[b];
x[b] = temp;
}
public static int findSmallest(String[] x, int start) {
int smallestIndex = start;
for (int i = start; i < x.length; i += 1) {
int cmp = x[i].compareTo(x[smallestIndex]);
if (cmp < 0) {
smallestIndex = i;
}
}
return smallestIndex;
}
}
我认为Junit的功能是获取绿色部分,该部分显示我的代码如何工作,并获取两个字符串是否相等的结果。
关于IntelliJ的另一个问题是,我运行它与使用终端进行编译和操作之间是否有区别?因为当我使用终端时,它将显示类似这样的
我对此进行了很多搜索,它总是说就像我没有将Junit.jar应用于classpath一样。我已检查是否已添加库。enter image description here
fyi,您可以在这里enter link description here
我调试了testSort函数,它在输入部分和sort函数部分运行良好。虽然它提示我enter image description here,但我选择了“下载”,它显示找不到enter image description here的源,而当我从现有文件enter image description here中选择源时,它会一直附加...我可以解决这个问题吗?
答案 0 :(得分:0)
您的代码可能未按预期运行,但它的运行完全符合经验更丰富的Java开发人员的预期。让我解释一下...
您已经发现=
运算符(或更确切地说,在本例中为!=
)的行为常常使经验不足的Java工程师陷入困境。 =
运算符不知道如何使用数组,因此它只能用于比较引用。在您的情况下,它正在比较input
和expected
以查看它们是否引用了完全相同的对象。在您的代码中,input
和expected
都被声明为新数组,因此是不同的,单独的对象。他们没有引用相同的对象。
对于assertArrayEquals
,它可能根本不使用=
运算符。虽然我没有查看该方法的源代码,但我敢冒险猜测它首先检查引用是否相等(它们是否都引用同一个对象,然后检查它们是否均为数组,然后检查是否每个数组都expected
的元素也位于input
中。
数组会增加平等的困惑,因为有许多关于平等的定义。平等可以定义为...
我有一个建议可能会帮助您更好地了解此问题(以及将来可能会遇到的更多问题),那就是看一下无法正常工作的方法的源代码。 ,在这种情况下为assertArrayEquals
。 IntelliJ允许您导航到源代码,或者如果源代码不可用,请查看反编译的字节码。在Mac上,只需在命令上单击鼠标右键。在Windows中,可以按住Control键并单击。 (对不起,IntelliJ有太多不同的快捷方式设置,我无法具体说明。)
有关此主题的更多信息... What is the difference between == vs equals() in Java? https://javabeginnerstutorial.com/core-java-tutorial/java-equals-method-vs-operator/