Подтвердить что ты не робот

Junit, как проверить, равна ли строка одной из двух строк?

Это кажется очень простым вопросом, но я просто не могу понять.

Я просто пытаюсь утверждать, что строка равна "string1" ИЛИ "string2".

Вот то, что я пробовал, но, очевидно, не работает.

assertEquals(d.getFormType(), "string1") || assertEquals(d.getFormType(), "string2");

assertEquals(d.getFormType(), "string1" || "string2");
4b9b3361

Ответ 1

Вы можете использовать assertTrue():

assertTrue(d.getFormType().equals("string1") ||
           d.getFormType().equals("string2"));

или используйте расширенную версию, чтобы предоставить дополнительную информацию в случае сбоя:

assertTrue("Unexpected value for d.getFormType(): " + d.getFormType(),
           d.getFormType().equals("string1") ||
           d.getFormType().equals("string2"));

Ответ 2

Я рекомендую использовать сочетания Hamcrest. Они интегрированы в JUnit через assertThat(), но вам нужно будет загрузить и установить hamcrest-all.jar.

Используя Hamcrest, вы можете решить свою проблему следующим образом:

import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;

assertThat(d.getFormType(), isOneOf("string1", "string2"));

Другой альтернативой, если вы не можете установить Hamcrest, было бы использование регулярного выражения:

assertTrue(d.getFormType().matches("(string1|string2)"));

Это более короткое и, возможно, более читаемое, чем объединение двух операторов equals():

String actual = d.getFormType();
assertTrue("string1".equals(actual) || "string2".equals(actual));

Ответ 3

Класс утверждения не имеет прямого способа делать то, что вы хотите. Но вы всегда можете вернуться к assertTrue и проверить любое условие, которое вы хотите.

assertTrue("string1".equals(d.getFormType()) || "string2".equals(d.getFormType()))

Ответ 4

как насчет

Assert.assertTrue("msg", Arrays.asList("string1", "string2").contains(searchString));

Я бы обновил msg, чтобы быть приятным дружественным сообщением, если он не работает.

Ответ 5

Я не знаю точного стиля JUnit, но я бы сделал что-то более простое, что сработает:

boolean stringEquals = false;
if ("string1".equals(d.getFormType()) || "string2".equals(d.getFormType())) {
    stringEquals = true;
}
assertTrue(stringEquals);

Ответ 6

Ваш вопрос не имеет смысла. Единичные тесты всегда имеют одинаковый результат - они не случайные или, скорее, их не должно быть. Поэтому JUnit не поддерживает переменные результаты.

Попробуйте найти способ настройки теста таким образом, чтобы результат не менялся.

Если это действительно невозможно, возможно, что-то не так с вашим кодом или, по крайней мере, с его дизайном.

Попробуйте исправить это.

Если вы действительно не можете, вы можете использовать:

boolean valid = ....some complex check...
assertTrue( valid );

[EDIT] Чтобы проверить сразу несколько значений, вы можете использовать этот трюк:

String[] values = ...;
assertEquals( "0:...\n1:...",  "0:" + values[0] + "\n" + "1:" + values[1] ... );

то есть. вы помещаете все значения в длинную строку и затем проверяете всю строку. Большинство IDE будут отображать различия в двух текстовых редакторах рядом друг с другом, поэтому любое несоответствие будет легко увидеть + маленькие подсказки (0:,...) в тексте скажут вам, где именно находится ошибка.