Ответ 1
Использование Hamcrest CoreMatcher
(включено в JUnit 4.4 и более поздние версии) и assertThat()
:
assertThat(myString, anyOf(is("value1"), is("value2"));
Я тестирую метод, чтобы увидеть, возвращает ли он правильную строку. Эта строка состоит из множества строк, порядок которых может измениться, что обычно дает две возможные комбинации. Этот порядок не имеет значения для моего приложения.
Однако, поскольку порядок строк может измениться, запись только утверждения Assert не будет работать, так как иногда он проходит тест, а иногда он терпит неудачу.
Итак, можно ли написать тест, который будет утверждать фактическое строковое значение в отношении 2 или более ожидаемых значений строк и посмотреть, равно ли они любому из них?
Использование Hamcrest CoreMatcher
(включено в JUnit 4.4 и более поздние версии) и assertThat()
:
assertThat(myString, anyOf(is("value1"), is("value2"));
Я использовал бы AssertJ для этого:
assertThat("hello").isIn("hello", "world");
Это более кратким и даст вам описательное сообщение, когда утверждение не получится.
Вы можете использовать Hamcrest для этого:
assertThat(testString, anyOf(
containsString("My first string"),
containsString("My other string")));
(Я вижу, что Йоахим просто ответил очень точно (+1)... я добавлю это в качестве другого примера.)
Если вы используете junit, я бы просто сделал что-то вроде следующего:
assertTrue(myString.equals("Value1") || myString.equals("Value"));
Простейшим/наиболее эффективным может быть
assert str.equals(result1) || str.equals(result2);
Это не будет иметь никаких накладных расходов, если у вас нет утверждений.
Если содержимое для строки исправлено, вы можете разбить ее на окончания строки перед сравнением. Затем просто сравните каждую строку с набором ожидаемых значений. Что-то вроде этого:
Set<String> expectedValues = ...
String[] split = text.split("\n");
for(String str : split) {
assert(expectedValues.contains(str));
}
Если вы хотите проверить, что все ожидаемые значения присутствуют, вы можете утверждать, что expectedValue.remove(str) == true
и утверждать после цикла, что Set пуст. Если несколько строк могут возникать несколько раз, вам нужно использовать сумку вместо Set.
Рассмотрите возможность написания пользовательского совпадения hamcrest, возвращаемого методом, в этом случае containsOneOf
, i.e.:
assertThat(myString, containsOneOf("value1", "value2"));
В соответствии с "шаблонами xUnit" вам следует избегать условной логики в вашем матчи, цикл с инструкцией break должен быть достаточным.
Посмотрите Hamcrest и xUnit Patterns для получения дополнительной информации.
Я использую следующее: надеюсь, это поможет:
String expectedTitles[] = {"Expected1","Expected2"};
List<String> expectedTitlesList = Arrays.asList(expectedTitles);
assertTrue(expectedTitlesList.contains((actualTitle)));
Я использую следующее:
assert expected1.equals(actual) || expected2.equals(actual);
Предполагая, что тестируемый метод возвращает массив, вы можете протестировать с помощью Hamcrest arrayContainingInAnyOrder.
assertThat(result, is(arrayContainingInAnyOrder("value1", "value2", "value")))
Примечание: использование обертки is
является чисто необязательным, используется только как читабельность сахара.
Я прочитал все ответы, но тот, который кажется наиболее компактным и выразительным для меня, использует Hamcrest isOneOf
, который уже включен в JUnit
assertThat(result, isOneOf("value1", "value2"));
который дает хорошее сообщение об ошибке при сбое.
java.lang.AssertionError:
Expected: one of {"value1", "value2"}
but: was "value"
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
[...]