Junit не показал никаких результатов с использованием IntelliJ для UCB cs61B (org.junit.Assert.assertArrayEquals ()) - PullRequest
0 голосов
/ 28 декабря 2018

Я изучаю 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.Я проверил, что я добавил библиотеку. введите описание изображения здесь

fyi, вы можете получить библиотеку здесь введите описание ссылки здесь

Я отладил функцию testSort, и она подходит для части ввода и части функций сортировки.в то время как он дает мне подсказку, что введите здесь описание изображения , я выбрал Загрузить, он показал источники, не найденные введите описание изображения здесь , а когда я выбрал источники из существующих файлов введитеописание изображения здесь , оно продолжает прикрепляться .... Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 28 декабря 2018

Ваш код может работать не так, как вы ожидали, но он работает именно так, как ожидал бы более опытный разработчик Java.Позвольте мне объяснить ...

Вы обнаружили поведение оператора = (или, точнее, в данном случае !=), который часто сбивает с толку менее опытных инженеров Java.Оператор = не знает, как работать с массивами, поэтому он вынужден сравнивать ссылки.В вашем случае он сравнивает input и expected, чтобы увидеть, ссылаются ли они на один и тот же объект.В вашем коде как input, так и expected объявлены как новые массивы, и поэтому это разные отдельные объекты;они не ссылаются на один и тот же объект.

Что касается assertArrayEquals, он, скорее всего, вообще не использует оператор =.Хотя я не смотрел исходный код этого метода, рискну предположить, что он сначала проверяет равенство ссылок (ссылаются ли они на один и тот же объект, затем проверяет, являются ли они оба массивами, а затем проверяет, является лиэлемент expected также находится в input.

Массивы могут добавить к путанице равенства, потому что существует много определений равенства. Равенство может быть определено как ...

  • оба массива имеют одинаковое количество элементов в одинаковом порядке
  • оба массива имеют одинаковое количество элементов, но разного порядка
  • один массив имеет 5 элементов, а другой имеет 10 элементов, где все 5элементы первого массива также находятся во втором массиве
  • и т. д.

У меня есть одно предложение, которое может помочь вам лучше понять эту проблему (а также многие другие проблемы, которые вы, вероятно,в будущем), чтобы посмотреть на исходный код метода, который не работает, как вы ожидаете, он будет работать, assertArrayEquals в этом случаекак таковые.IntelliJ позволяет вам перейти к исходному коду, или, если исходный код недоступен, посмотрите на декомпилированный байт-код.На Mac просто Ctrl-клик по методу.В Windows это может быть Control-click ???(извините, у IntelliJ так много разных наборов ярлыков, что я не могу быть более конкретным.)

Дополнительная информация по этой теме ... В чем разница между == и equals () в Java? https://javabeginnerstutorial.com/core-java-tutorial/java-equals-method-vs-operator/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...