Suponha que eu queira testar a unidade de um método com esta assinatura:
List<MyItem> getMyItems();
Suponha que MyItem
seja um Pojo que possui muitas propriedades, uma das quais é "name"
, acessada via getName()
.
Tudo que me importa é verificar se o List<MyItem>
, ou qualquer Iterable
, contém duas MyItem
instâncias, cujas "name"
propriedades têm os valores "foo"
e "bar"
. Se alguma outra propriedade não corresponder, realmente não me importo com os propósitos deste teste. Se os nomes corresponderem, o teste foi bem-sucedido.
Eu gostaria que fosse uma linha, se possível. Aqui está alguma "pseudo-sintaxe" do tipo de coisa que eu gostaria de fazer.
assert(listEntriesMatchInAnyOrder(myClass.getMyItems(), property("name"), new String[]{"foo", "bar"});
Hamcrest seria bom para esse tipo de coisa? Em caso afirmativo, qual seria exatamente a versão hamcrest da minha pseudo-sintaxe acima?
fonte
Não é especialmente Hamcrest, mas acho que vale a pena mencionar aqui. O que eu uso com frequência no Java8 é algo como:
(Editado para uma ligeira melhoria de Rodrigo Manyari. É um pouco menos prolixo. Ver comentários.)
Pode ser um pouco mais difícil de ler, mas gosto do tipo e da segurança da refatoração. Também é excelente para testar várias propriedades de feijão em combinação. por exemplo, com uma expressão && semelhante a java no filtro lambda.
fonte
Assertj é bom nisso.
Uma grande vantagem para o assertj em comparação com o hamcrest é o uso fácil do auto-completar de código.
fonte
AssertJ fornece um excelente recurso em
extracting()
: você pode passarFunction
s para extrair campos. Ele fornece uma verificação em tempo de compilação.Você também pode definir o tamanho primeiro facilmente.
Isso daria:
containsExactlyInAnyOrder()
afirma que a lista contém apenas esses valores, seja qual for a ordem.Para afirmar que a lista contém esses valores seja qual for a ordem, mas também pode conter outros valores, use
contains()
:Como uma observação lateral: para declarar vários campos de elementos de a
List
, com AssertJ fazemos isso envolvendo os valores esperados para cada elemento em umatuple()
função:fonte
Contanto que sua Lista seja uma classe concreta, você pode simplesmente chamar o método contains () desde que tenha implementado seu método equals () em MyItem.
Presume que você implementou um construtor que aceita os valores que você deseja declarar. Sei que não está em uma única linha, mas é útil saber qual valor está faltando, em vez de verificar os dois ao mesmo tempo.
fonte
AssertJ 3.9.1 suporta o uso direto de predicado no
anyMatch
método.Geralmente, esse é um caso de uso adequado para uma condição arbitrariamente complexa.
Para condições simples, prefiro usar o
extracting
método (consulte acima) porque o iterável sob teste resultante pode oferecer suporte à verificação de valor com melhor legibilidade. Exemplo: pode fornecer API especializada, comocontains
método na resposta de Frank Neblung. Ou você pode chamáanyMatch
-lo mais tarde de qualquer maneira e usar a referência de método como"searchedvalue"::equals
. Além disso, vários extratores podem ser colocados noextracting
método, o resultado verificado subsequentemente usandotuple()
.fonte