Como posso fazer uma asserção de igualdade entre listas em um caso de teste JUnit ? A igualdade deve estar entre o conteúdo da lista.
Por exemplo:
List<String> numbers = Arrays.asList("one", "two", "three");
List<String> numbers2 = Arrays.asList("one", "two", "three");
List<String> numbers3 = Arrays.asList("one", "two", "four");
// numbers should be equal to numbers2
//numbers should not be equal to numbers3
java
unit-testing
collections
junit
Kamal
fonte
fonte
assertArrayEquals
hoje em dia. Use em combinação comList#toArray
.assertArrayEquals
requer que você obtenha matrizes de suas listas. Você pode operar diretamente na lista usandoassertIterableEquals
assertIterableEquals
disponível para jUnit5 @ThetaSinnerRespostas:
Sei que isso foi perguntado há alguns anos, provavelmente esse recurso não existia na época. Mas agora, é fácil fazer isso:
Se você possui uma versão recente do Junit instalada com hamcrest, basta adicionar estas importações:
http://junit.org/junit4/javadoc/latest/org/junit/Assert.html#assertThat(T, org.hamcrest.Matcher)
http://junit.org/junit4/javadoc/latest/org/hamcrest/CoreMatchers.html
http://junit.org/junit4/javadoc/latest/org/hamcrest/core/Is.html
fonte
System.out.println(actual == expected);
retornará falso, masSystem.out.println(actual.equals(expected));
retornará verdadeiro..equals(..)
vez de==
?Não transforme em string e compare. Isso não é bom para o desempenho. Em junho, dentro do Corematchers, há um matcher para isso =>
hasItems
Esta é a melhor maneira que eu conheço de verificar elementos em uma lista.
fonte
Assert.assertEquals(4,yourList.size());
assertThat(yourList.toArray(), arrayContainingInAnyOrder(1,2,3,4,5));
toString()
versão não é a melhor maneira.Esta é uma resposta herdada, adequada para o JUnit 4.3 e abaixo. A versão moderna do JUnit inclui mensagens de falha legíveis internas no método assertThat. Prefira outras respostas sobre esta pergunta, se possível.
Para o registro, como @Paul mencionou em seu comentário a esta resposta, dois
List
s são iguais:Veja os JavaDocs da
List
interface .fonte
assertEquals(Object, Object)
do JUnit4 / JUnit 5 ouassertThat(actual, is(expected));
do Hamcrest, proposto nas outras respostas, funcionará apenas como ambosequals()
etoString()
será substituído pelas classes (e profundamente) dos objetos comparados.É importante porque o teste de igualdade na asserção se baseia
equals()
e a mensagem de falha de teste se baseia nostoString()
objetos comparados.Para classes integradas como
String
,Integer
e assim por diante ... não há problema, pois essas substituem ambosequals()
etoString()
. Portanto, é perfeitamente válido afirmarList<String>
ouList<Integer>
comassertEquals(Object,Object)
.E sobre este assunto: você deve substituir
equals()
em uma classe porque faz sentido em termos de igualdade de objetos, não apenas para facilitar as afirmações em um teste com JUnit.Para facilitar as afirmações, você tem outras maneiras.
Como prática recomendada, sou a favor das bibliotecas de asserção / correspondência.
Aqui está uma solução AssertJ .
org.assertj.core.api.ListAssert.containsExactly()
é o que você precisa: verifica se o grupo real contém exatamente os valores fornecidos e nada mais, na ordem indicada no javadoc.Suponha uma
Foo
classe em que você adicione elementos e onde possa obtê-lo.Um teste de unidade
Foo
disso afirma que as duas listas têm o mesmo conteúdo:Um ponto positivo da AssertJ é que declarar a
List
como esperado é desnecessário: torna a afirmação mais direta e o código mais legível:Mas as bibliotecas de asserções / correspondências são uma obrigação, porque elas realmente serão mais avançadas.
Suponha agora que
Foo
não armazeneString
s masBar
s instâncias.Essa é uma necessidade muito comum. Com AssertJ a asserção ainda é simples de escrever. Melhor você pode afirmar que o conteúdo da lista é igual, mesmo que a classe dos elementos não substitua
equals()/hashCode()
enquanto a maneira JUnit exigir que:fonte
Se você não se importa com a ordem dos elementos, recomendo
ListAssert.assertEquals
em junit-addons.Link: http://junit-addons.sourceforge.net/
Para usuários preguiçosos do Maven:
fonte
Você pode usar assertEquals em junho.
Se a ordem dos elementos for diferente, retornará um erro.
fonte
Se você não deseja criar uma lista de matrizes, também pode tentar isso
fonte
fonte
Não reinvente a roda!
Existe uma biblioteca do Google Code que faz isso para você: Hamcrest
fonte
Eu sei que já existem muitas opções para resolver esse problema, mas eu prefiro fazer o seguinte para afirmar duas listas em qualquer oder :
fonte
assertEquals(expected, result);
funciona para mim. Como essa função obtém dois objetos, você pode passar qualquer coisa para ela.fonte
Eu não faço isso, todas as respostas acima estão dando a solução exata para comparar duas listas de objetos. A maioria das abordagens acima pode ser útil no seguinte limite de comparação apenas - Comparação de tamanho - Comparação de referência
Mas se tivermos listas de objetos do mesmo tamanho e dados diferentes no nível dos objetos, essa abordagem de comparação não ajudará.
Eu acho que a abordagem a seguir funcionará perfeitamente com a substituição de igual e método hashcode no objeto definido pelo usuário.
Eu usei a Xstream lib para substituir iguais e código de hash, mas podemos substituir iguais e código de hash por lógicas / comparações vencidas também.
Aqui está o exemplo para sua referência
O mais importante é que você possa ignorar os campos por Anotação (@XStreamOmitField) se não desejar incluir nenhum campo na verificação igual de Objetos. Existem muitas anotações como essa para configurar, portanto, dê uma olhada nas anotações dessa lib.
Estou certo de que esta resposta economizará seu tempo para identificar a abordagem correta para comparar duas listas de objetos :). Por favor, comente se você encontrar algum problema sobre isso.
fonte