онструкторная сортировка (строка[][], 11, 12);» не определена в junit

#java #junit4

#java #junit4

Вопрос:

Я пытаюсь написать тест для следующего метода:

  public class Sort {

...
...
...

    public static String[][] findRanks(String[][] array, int indexOfPoints, int indexOfRank) {

        for (int i = 0; i < array.length - 1; i  ) { 
            int compare = 1;
            if (i < array.length - 2)
                compare = Double.valueOf(array[i][indexOfPoints]).compareTo(Double.valueOf(array[i   1][indexOfPoints]));

            if (i == array.length - 1 || compare != 0) { 
                array[i][indexOfRank] = Integer.toString(i   1);
            }
            else {
                array[i][indexOfRank] = Integer.toString(i   1)   " - "   Integer.toString(i   2);
                array[i 1][indexOfRank] = Integer.toString(i   1)   " - "   Integer.toString(i   2);
                i  ;
            }
        }
        return array;   
    }

}
  

Я попробовал следующий тест:

 import static org.junit.Assert.*;
import junit.framework.TestCase;
import org.junit.Test;

public class SortTest extends TestCase {

    @Test
    public void testFindRanks() {
        String[][] array = { {"Siim Susi","12.61","5.00","9.22","1.50","60.39","16.43","21.60","2.60","35.81","5.25.72","6253.0","1"}, 
                {"Beata Kana","13.04","4.53","7.79","1.55","64.72","18.74","24.20","2.40","28.20","6.50.76","5290.0","2"}};

        Sort test1 = new Sort(array, 11, 12); //This is where the problem is

        String[][] expected = { {"Siim Susi","12.61","5.00","9.22","1.50","60.39","16.43","21.60","2.60","35.81","5.25.72","6253.0","1"}, 
                                {"Beata Kana","13.04","4.53","7.79","1.55","64.72","18.74","24.20","2.40","28.20","6.50.76","5290.0","2"}};

        assertTrue(expected.equals(test1));
        fail("Not yet implemented");
    }

}
  

Но тест продолжает сообщать мне «конструктор сортировки (строка[][], 11, 12);» не определено.
Почему он думает, что это должен быть конструктор и как мне это исправить?

Спасибо.

Ответ №1:

Вы должны написать

     String[][] results = Sort.findRanks(array, 11, 12);
  

и чтобы сделать ваши модульные тесты более чистыми, более идиоматичными и простыми в обслуживании, вы также могли бы немного реорганизовать их:

 public class SortTest extends TestCase {

    @Test
    public void testFindRanks() {
        String[][] array = {...};
        String[][] expected = {...};

        String[][] result = Sort.findRanks(array, 11, 12);

        assertArrayEquals(expected, result);
    }
}
  

То есть разделите тестовую настройку, вызов тестируемого метода и код проверки. Также удалите fail вызов с конца, поскольку это приведет к тому, что ваш тест всегда завершится неудачей 🙂

Комментарии:

1. @Sean, @nicholas, упс, исправлено 🙂

Ответ №2:

Похоже, вам нужно сделать

  String[][] actual = Sort.findRanks(array, 11, 12);
  

и затем

 assertArrayEquals(expected, actual);
  

Комментарии:

1. findRanks(…) является статическим, и хотя это будет работать, это не является предпочтительным синтаксисом.

2. @nicholas Я заметил это после того, как ответил, и я пересмотрел свой ответ. Спасибо.

Ответ №3:

Это вызов конструктора:

 new Sort(array, 11, 12)
  

И компилятор жалуется, если такой конструктор недоступен

Прочитайте о конструкторах в руководстве по Java

Ответ №4:

Сообщение абсолютно правильное: ваш Sort класс не определяет конструктор, который принимает String[][], int, int в качестве параметров, который вы вызываете в строке, в которой возникла проблема.

Вам нужно:

 String[][] actual = Sort.findRanks(array, 11, 12);
  

Ответ №5:

Ну, не похоже, что у вас есть Sort определенный конструктор (по крайней мере, в коде, который вы опубликовали). И компилятор / IDE сообщает вам, что у вас не определен Sort конструктор.

Вы, вероятно, имеете в виду вызов этой строки:

 String[][] value = Sort.findRanks(array, 11, 12);
//Sort test1 = new Sort(array, 11, 12); <-- dont call this...call the above...