Junit没有使用IntelliJ for UCB cs61B(org.junit.Assert.assertArrayEquals())

时间:2018-12-28 03:08:10

标签: java intellij-idea junit

我正在独自学习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的另一个问题是,我运行它与使用终端进行编译和操作之间是否有区别?因为当我使用终端时,它将显示类似这样的

enter image description here

我对此进行了很多搜索,它总是说就像我没有将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中选择源时,它会一直附加...我可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

您的代码可能未按预期运行,但它的运行完全符合经验更丰富的Java开发人员的预期。让我解释一下...

您已经发现=运算符(或更确切地说,在本例中为!=)的行为常常使经验不足的Java工程师陷入困境。 =运算符不知道如何使用数组,因此它只能用于比较引用。在您的情况下,它正在比较inputexpected以查看它们是否引用了完全相同的对象。在您的代码中,inputexpected都被声明为新数组,因此是不同的,单独的对象。他们没有引用相同的对象。

对于assertArrayEquals,它可能根本不使用=运算符。虽然我没有查看该方法的源代码,但我敢冒险猜测它首先检查引用是否相等(它们是否都引用同一个对象,然后检查它们是否均为数组,然后检查是否每个数组都expected的元素也位于input中。

数组会增加平等的困惑,因为有许多关于平等的定义。平等可以定义为...

  • 两个具有相同顺序的相同数量元素的数组
  • 两个数组的元素数量相同,但顺序不同
  • 一个数组包含5个元素,而另一个数组包含10个元素,其中第一个数组的所有5个元素也位于第二个数组中

我有一个建议可能会帮助您更好地了解此问题(以及将来可能会遇到的更多问题),那就是看一下无法正常工作的方法的源代码。 ,在这种情况下为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/