JUnit 5 Параметры типа коллекции вызывают ошибки с помощью & ldquo; @ ParameterizedTest & rdquo;

Все объекты гарантированно имеют метод .equals(), поскольку Object содержит метод, .equals(), который возвращает логическое значение. Задача подкласса переопределять этот метод, если требуется дополнительное определение определения. Без него (т. Е. С помощью ==) только адреса памяти проверяются между двумя объектами для равенства. String переопределяет этот метод .equals() и вместо использования адреса памяти возвращает сравнение строк на уровне символа для равенства.

Ключевое замечание состоит в том, что строки хранятся в одном пуле, поэтому после создания строки он всегда хранится в программе по тому же адресу. Строки не меняются, они неизменяемы. Вот почему это плохая идея использовать регулярную конкатенацию строк, если у вас есть серьезное количество обработки строк. Вместо этого вы будете использовать предоставленные классы StringBuilder. Помните, что указатели на эту строку могут измениться, и если вам было интересно увидеть, были ли два указателя одинаковыми ==, это был бы прекрасный способ. Строки сами не делают.

0
задан Mureinik 13 July 2018 в 11:13
поделиться

1 ответ

Вы смешиваете параметры JUnit 4 и JUnit Jupiter с параметрами. В JUnit JUpiter нет тестового бегуна, конструктор остается без параметров и вы передаете параметры методу тестирования (в некотором смысле это напоминает теории JUnit 4):

public class SentenceSplitterTest  {
    private SentenceSplitter sentencesplitter;
    private static CollectionClass collectionClass;

    // Initialization of CollectionClass moved here (instead of a static block) for two 
    // reasons:
    // 1. If the initialization fails, you can't run the test anyway - better fail 
    //    right here that print an error and continue to the test which we 
    //    know won't work
    // 2. It just looks neater
    @BeforeAll
    public static void initializeCollectionClass() throws IOException {
        collectionClass = new CollectionClass();
    }

    @Before
    public void initializeSentenceSplitter() throws IOException {
        sentencesplitter = new SentenceSplitter();
    }

    @ParameterizedTest
    @MethodSource("data")
    public void testSentenceSplitterTest(DataStructure ds) {
        String input = ds.string;
        List<String> output = ds.listOfString;
        assertEquals(output, sentencesplitter.sentenceSplit(input));
    }

    public static Stream<DataStructure> data() {
        return collectionClass.getContent().stream();
    }
}
0
ответ дан Mureinik 17 August 2018 в 13:27
поделиться
  • 1
    Прежде всего, спасибо за ваше время. На этот раз я снова получаю 2 ошибки. Для InitializationError я получаю это: java.lang.Exception: нет метода открытых статических параметров в классе Classes.SentenceSplitterTest, и для каждого элемента я получаю это: java.lang.NullPointerException – KBO 13 July 2018 в 08:42
  • 2
    Кстати, "@RunWith (Parameterized.class)" все еще находится над линией объявления публичного класса SentenceSplitterTest {..}. Должен ли я удалить его? – KBO 13 July 2018 в 08:45
  • 3
    Исключение о nullpointer происходит в строке «Список & lt; String & gt; output = ds.listOfString; & quot ;, возможно, это может дать представление. – KBO 13 July 2018 в 08:52
  • 4
    @KBO, да, вы должны удалить аннотацию runner. Как вы можете видеть, это не ответ. – M. Prokhorov 13 July 2018 в 08:57
  • 5
    @ М.Прохоров Извините. InitializationError исчез после удаления аннотации runner. Остальные остаются. – KBO 13 July 2018 в 08:59
Другие вопросы по тегам:

Похожие вопросы: