Alguém sabe por que o JUnit 4 fornece, assertEquals(foo,bar)
mas não assertNotEqual(foo,bar)
métodos?
Ele fornece assertNotSame
(correspondente a assertSame
) e assertFalse
(correspondente a assertTrue
), portanto, parece estranho que eles não se incomodassem em incluir assertNotEqual
.
A propósito, eu sei que o JUnit-addons fornece os métodos que estou procurando. Só estou perguntando por curiosidade.
Respostas:
Eu sugiro que você use as declarações de
assertThat()
estilo mais recentes , que podem descrever facilmente todos os tipos de negações e criar automaticamente uma descrição do que você esperava e do que conseguiu se a declaração falhar:Todas as três opções são equivalentes, escolha a que você achar mais legível.
Para usar os nomes simples dos métodos (e permitir que essa sintaxe tensa funcione), você precisa destas importações:
fonte
assertNotEquals()
.assertNotEqual
", eu diria que é porque é uma afirmação especializada que não é necessária com a frequência necessáriaassertEquals
e, portanto, seria expressa por meio do genéricoassertFalse
.assertThat
é muito mais expressivo do que o conjunto limitado deassert*
métodos disponíveis. Portanto, você pode expressar as restrições exatas em uma única linha, ler (quase) como uma frase em inglês e receber uma mensagem significativa quando a declaração falhar. É verdade que nem sempre é um recurso matador, mas quando você o vê em ação algumas vezes, verá quanto valor agrega.assertThat
é mais expressivo do queassert*
, mas não acho que seja mais expressivo do que a expressão java que você pode colocar dentro e fora daassert*
expressão em geral (afinal, eu posso expressar qualquer coisa no código java). É um problema geral que eu comecei a encontrar com APIs de estilo fluente - cada uma é basicamente um novo DSL que você precisa aprender (quando todos já conhecemos o Java!). Suponho que Hamcrest seja onipresente o suficiente agora que é razoável esperar que as pessoas o conheçam. Eu vou ter um jogo ...Existe um
assertNotEquals
no JUnit 4.11: https://github.com/junit-team/junit/blob/master/doc/ReleaseNotes4.11.md#improvements-to-assert-and-assumefonte
Eu me pergunto o mesmo. A API do Assert não é muito simétrica; para testar se os objetos são iguais, ele fornece
assertSame
eassertNotSame
.Obviamente, não demorou muito para escrever:
Com essa afirmação, infelizmente, a única parte informativa da saída é o nome do método de teste; portanto, a mensagem descritiva deve ser formada separadamente:
É claro que é tão tedioso que é melhor rolar o seu próprio
assertNotEqual
. Felizmente, no futuro, talvez faça parte do JUnit: JUnit issue 22fonte
Eu diria que a ausência de assertNotEqual é de fato uma assimetria e torna a JUnit um pouco menos aprendível. Lembre-se de que esse é um caso interessante ao adicionar um método diminuiria a complexidade da API, pelo menos para mim: a simetria ajuda a controlar o espaço maior. Meu palpite é que o motivo da omissão pode ser que haja muito poucas pessoas pedindo o método. Ainda assim, lembro-me de uma época em que mesmo afirmarFalse não existia; portanto, tenho uma expectativa positiva de que o método possa eventualmente ser adicionado, uma vez que não é difícil; embora reconheça que existem várias soluções alternativas, mesmo as mais elegantes.
fonte
Estou chegando a esta festa muito tarde, mas descobri que o formulário:
pode ser feito para funcionar na maioria dos casos 'não iguais'.
fonte
Estou trabalhando no JUnit no ambiente java 8, usando o jUnit4.12
para mim: o compilador não conseguiu encontrar o método assertNotEquals, mesmo quando eu usei
import org.junit.Assert;
Então eu mudei
assertNotEquals("addb", string);
para
Assert.assertNotEquals("addb", string);
Portanto, se você estiver enfrentando um problema em relação ao
assertNotEqual
não reconhecido, altere-o para queAssert.assertNotEquals(,);
ele resolva o seu problemafonte
import static org.junit.Assert.*;
e você poderá usar todas as declarações sem o nome da classe.A razão óbvia pela qual as pessoas queriam assertNotEquals () era comparar os componentes internos sem precisar convertê-los em objetos completos antes:
Exemplo detalhado:
vs.
Infelizmente, como o Eclipse não inclui o JUnit 4.11 por padrão, você deve estar detalhado.
Advertência Eu não acho que o '1' precise ser envolvido em um Integer.valueOf (), mas desde que eu retornei do .NET, não conte com a minha correção.
fonte
É melhor usar o Hamcrest para afirmações negativas, em vez de assertFalse, pois no primeiro caso o relatório de teste mostrará uma diferença para a falha de afirmação.
Se você usar assertFalse, você apenas terá uma falha de afirmação no relatório. isto é, informações perdidas sobre a causa da falha.
fonte
Geralmente faço isso quando espero que dois objetos sejam iguais:
e:
quando se espera que sejam desiguais. Estou ciente de que isso não é uma resposta para sua pergunta, mas é o mais próximo que posso chegar. Isso pode ajudar outras pessoas a procurar o que podem fazer nas versões do JUnit anteriores ao JUnit 4.11.
fonte
Eu concordo totalmente com o ponto de vista do OP.
Assert.assertFalse(expected.equals(actual))
não é uma maneira natural de expressar uma desigualdade.Mas eu argumentaria que, além do mais
Assert.assertEquals()
,Assert.assertNotEquals()
funciona , mas não é amigável, documentar o que o teste realmente afirma e entender / depurar quando a afirmação falhar.Então, sim, o JUnit 4.11 e o JUnit 5 fornece
Assert.assertNotEquals()
(Assertions.assertNotEquals()
no JUnit 5), mas eu realmente evito usá-los.Como alternativa, para afirmar o estado de um objeto, geralmente uso uma API de correspondência que explora facilmente o estado do objeto, que documenta claramente a intenção das afirmações e é muito amigável para entender a causa da falha de afirmação.
Aqui está um exemplo.
Suponha que eu tenha uma classe Animal na qual desejo testar o
createWithNewNameAndAge()
método, um método que cria um novo objeto Animal alterando seu nome e sua idade, mas mantendo sua comida favorita.Suponha que eu use
Assert.assertNotEquals()
para afirmar que os objetos originais e os novos são diferentes.Aqui está a classe Animal com uma implementação falha de
createWithNewNameAndAge()
:JUnit 4.11+ (ou JUnit 5), tanto como executor de teste quanto como ferramenta de asserção
O teste falha conforme o esperado, mas a causa fornecida ao desenvolvedor não é realmente útil. Diz apenas que os valores devem ser diferentes e
toString()
gerar o resultado invocado noAnimal
parâmetro atual :Ok, os objetos não são iguais. Mas onde está o problema?
Qual campo não é avaliado corretamente no método testado? 1 ? Dois ? Todos eles ?
Para descobri-lo, você precisa cavar na
createWithNewNameAndAge()
implementação / usar um depurador, enquanto a API de teste seria muito mais amigável se nos fizesse o diferencial entre o que é esperado e o que é obtido.JUnit 4.11 como executor de teste e uma API Matcher de teste como ferramenta de asserção
Aqui está o mesmo cenário de teste, mas que usa o AssertJ (uma excelente API de correspondência de teste) para fazer a afirmação do
Animal
estado:É claro que o teste ainda falha, mas desta vez o motivo está claramente indicado:
Podemos ler que, para
Animal::getName, Animal::getAge, Animal::getFavoriteFood
valores do Animal retornado, esperamos ter o seguinte valor:mas tivemos esses valores:
Portanto, sabemos onde investigar:
name
eage
não são corretamente avaliados. Além disso, o fato de especificar ohay
valor na asserção deAnimal::getFavoriteFood()
permite também afirmar com mais precisão o retornoAnimal
. Queremos que os objetos não sejam os mesmos para algumas propriedades, mas não necessariamente para todas as propriedades.Então, definitivamente, o uso de uma API de correspondência é muito mais claro e flexível.
fonte
Consistência da API do módulo, por que o JUnit não forneceu
assertNotEquals()
é o mesmo motivo pelo qual o JUnit nunca forneceu métodos comoassertStringMatchesTheRegex(regex, str)
vs.assertStringDoesntMatchTheRegex(regex, str)
assertStringBeginsWith(prefix, str)
vs.assertStringDoesntBeginWith(prefix, str)
ou seja, não há fim em fornecer métodos de afirmação específicos para os tipos de coisas que você pode querer em sua lógica de afirmação!
Muito melhor para fornecer primitivas teste combináveis como
equalTo(...)
,is(...)
,not(...)
,regex(...)
e deixar a peça programador aqueles juntos, em vez de mais legibilidade e sanidade.fonte