CollectionAssert no JUnit?
Pergunta
Existe uma jUnit paralelo ao do NUnit CollectionAssert
?
Solução
Usando JUnit 4.4 você pode usar assertThat()
juntamente com a Hamcrest código (não se preocupe, é fornecido com JUnit, há necessidade de um .jar
adicional) para produzir complexo auto-descrevendo afirma inclusive que operam em coleções:
import static org.junit.Assert.assertThat;
import static org.junit.matchers.JUnitMatchers.*;
import static org.hamcrest.CoreMatchers.*;
List<String> l = Arrays.asList("foo", "bar");
assertThat(l, hasItems("foo", "bar"));
assertThat(l, not(hasItem((String) null)));
assertThat(l, not(hasItems("bar", "quux")));
// check if two objects are equal with assertThat()
// the following three lines of code check the same thing.
// the first one is the "traditional" approach,
// the second one is the succinct version and the third one the verbose one
assertEquals(l, Arrays.asList("foo", "bar")));
assertThat(l, is(Arrays.asList("foo", "bar")));
assertThat(l, is(equalTo(Arrays.asList("foo", "bar"))));
Usando essa abordagem, você vai automagicamente ter uma boa descrição do assert quando ele falhar.
Outras dicas
Não diretamente, não. Eu sugiro o uso de Hamcrest , que fornece um rico conjunto de regras de correspondência que integra bem com jUnit (e outros testando enquadramentos)
Dê uma olhada FEST Fluente afirmações. IMHO eles são mais convenientes de usar do que Hamcrest (e igualmente poderoso, extensível etc) e têm melhor suporte IDE graças à interface fluente. Consulte https://github.com/alexruiz/fest- assert-2.x / wiki / Usando-Fest-afirmações
A solução de Joachim Sauer é bom, mas não funciona se você já tem um conjunto de expectativas que pretende verificar estão em seu resultado. Isso pode aparecer quando você já tem uma expectativa gerado ou constante em seus testes que você quiser comparar um resultado para, ou talvez você tem várias expectativas que você espera a serem incorporadas no resultado. Então, em vez de usar matchers você pode pode apenas usar List::containsAll
e assertTrue
Por exemplo:
@Test
public void testMerge() {
final List<String> expected1 = ImmutableList.of("a", "b", "c");
final List<String> expected2 = ImmutableList.of("x", "y", "z");
final List<String> result = someMethodToTest();
assertThat(result, hasItems(expected1)); // COMPILE ERROR; DOES NOT WORK
assertThat(result, hasItems(expected2)); // COMPILE ERROR; DOES NOT WORK
assertTrue(result.containsAll(expected1)); // works~ but has less fancy
assertTrue(result.containsAll(expected2)); // works~ but has less fancy
}