É possível no JUnit afirmar que um objeto é uma instância de uma classe? Por várias razões, tenho um objeto em meu teste no qual desejo verificar o tipo. É um tipo de Object1 ou um tipo de Object2?
Atualmente tenho:
assertTrue(myObject instanceof Object1);
assertTrue(myObject instanceof Object2);
Isso funciona, mas eu queria saber se existe uma maneira mais expressiva de fazer isso.
Por exemplo, algo como:
assertObjectIsClass(myObject, Object1);
Eu poderia fazer isso:
assertEquals(myObject.class, Object1.getClass());
Existe um método de afirmação específico que me permita testar um tipo de objeto de uma maneira mais elegante e fluida?
java
unit-testing
junit
RNJ
fonte
fonte
assertTrue(myObject instanceof Object1);
eassertEquals(myObject.class, Object1.getClass());
é realmente testes diferentes? O primeiro aceita myObject como uma instância de uma subclasse deObject1
, o posterior não.assertTrue
.assertTrue
diria apenasexpected true got false
, Hamcrest diriaexpected instanced of XYZ, got instance of ABC
Respostas:
Você pode usar o
assertThat
método e os Matchers que acompanham o JUnit.Dê uma olhada neste link que descreve um pouco sobre os JUnit Matchers.
Exemplo:
Teste:
fonte
instanceof
:BaseClass subClass = new SubClass(); assertThat(subClass, isA(SubClass.class));
, mas ele não compilar porqueSubClass
não é? super BaseClass
.instanceOf(BaseClass.class)
parainstanceOf(String.class)
e você verá que ele compila muito bem, mas haverá um AssertionError lançado.Class<T>
vez deClass<?>
(que é o que instanceOf faz). Como captura a classe, seria um erro de tempo de compilação executar isA com uma classe incompatível com a instância. github.com/hamcrest/JavaHamcrest/issues/39Como
assertThat
qual foi a resposta antiga agora está obsoleta, estou postando a solução correta:assertTrue(objectUnderTest instanceof TargetObject);
fonte
true
certo? E acho que você deseja testar o tipo real.Solução para JUnit 5
A documentação diz:
Exemplo para Hamcrest :
Exemplo para AssertJ :
Observe que isso pressupõe que você deseja testar comportamentos semelhantes a
instanceof
(que aceita subclasses). Se você deseja exatamente o mesmo tipo, não vejo uma maneira melhor do que afirmar que as duas classes são iguais, como você mencionou na pergunta.fonte
assertThat()
é adiado para Hamcrest, para que o JUnit também trabalhe com bibliotecas de afirmação de terceiros.instanceOf
comoinstanceof
(lembre-se do caso).instanceOf
é uma função enquantoinstanceof
é uma palavra-chave Java .Solução para JUnit 5 para Kotlin!
Exemplo para Hamcrest :
Exemplo para AssertJ :
fonte