Estou usando o JUnit-dep 4.10 e o Hamcrest 1.3.RC2.
Eu criei um correspondente personalizado que se parece com o seguinte:
public static class MyMatcher extends TypeSafeMatcher<String> {
@Override
protected boolean matchesSafely(String s) {
/* implementation */
}
@Override
public void describeTo(Description description) {
/* implementation */
}
@Override
protected void describeMismatchSafely(String item, Description mismatchDescription) {
/* implementation */
}
}
Funciona perfeitamente quando executado a partir da linha de comando usando o Ant. Mas quando executado no IntelliJ, ele falha com:
java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:18)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
at com.netflix.build.MyTest.testmyStuff(MyTest.java:40)
Meu palpite é que ele está usando o hamcrest.MatcherAssert errado. Como encontro qual hamcrest.MatcherAssert está sendo usado (ou seja, qual arquivo jar está sendo usado para hamcrest.MatcherAssert)? AFAICT, os únicos frascos de hamcrest no meu caminho de classe é 1.3.RC2.
O IntelliJ IDEA está usando sua própria cópia do JUnit ou Hamcrest?
Como eu produzo o CLASSPATH de tempo de execução que o IntelliJ está usando?
Esse problema também surge quando você tem mockito-all no caminho da classe, que já está obsoleto.
Se possível, inclua mockito-core .
Configuração do Maven para misturar junit, mockito e hamcrest:
fonte
O problema era que a classe errada
hamcrest.Matcher
, e nãohamcrest.MatcherAssert
, estava sendo usada. Isso estava sendo extraído de uma dependência junit-4.8 que uma das minhas dependências estava especificando.Para ver quais dependências (e versões) estão incluídas em qual fonte durante o teste, execute:
fonte
-all
por-core
, etc ...): tive que mudar o hamcrest de volta para a versão 1.1 e agora tudo funciona novamente.import static org.mockito.Matchers.anyString;
de #import static org.mockito.ArgumentMatchers.anyString;
O seguinte deve ser o mais correto hoje. Observe, a junção 4.11 depende do hamcrest-core, portanto, não é necessário especificar que o mockito-all não possa ser usado, pois inclui (não depende) hamcrest 1.1
fonte
mockito-all
ajudou para mim, nãomockito-core
. Também declarando Hamcrest antes de Mockito empom.xml
obras.Isso funcionou para mim depois de lutar um pouco
fonte
Experimentar
expect(new ThrowableMessageMatcher(new StringContains(message)))
ao invés de
expectMessage(message)
Você pode escrever um
ExpectedException
método personalizado ou utilitário para agrupar o código.fonte
Eu sei que esse é um thread antigo, mas o que resolveu o problema foi adicionar o seguinte aos meus arquivos build.gradle. Como já foi dito acima, há um problema de compatibilidade com
mockito-all
Mensagem possivelmente útil :
fonte
Apesar de ser uma pergunta muito antiga e provavelmente muitas das idéias mencionadas resolverem muitos problemas, ainda quero compartilhar a solução com a comunidade que resolveu o meu problema.
Eu descobri que o problema era uma função chamada "hasItem" que eu estava usando para verificar se um JSON-Array contém ou não um item específico. No meu caso, verifiquei um valor do tipo Long.
E isso levou ao problema.
De alguma forma, os Matchers têm problemas com valores do tipo Long. (Eu não uso tanto o JUnit ou o Rest-Assured quanto o idk. Exatamente por que, mas acho que os dados JSON retornados contêm apenas números inteiros.)
Então, o que eu fiz para resolver o problema foi o seguinte. Ao invés de usar:
você só precisa converter para Inteiro. Portanto, o código de trabalho ficou assim:
Essa provavelmente não é a melhor solução, mas eu só queria mencionar que a exceção também pode ser lançada devido a tipos de dados errados / desconhecidos.
fonte
O que funcionou para mim foi excluir o grupo hamcrest da compilação do teste junit.
Aqui está o código do meu build.gradle:
Se você estiver executando o IntelliJ, poderá ser necessário executar
gradle cleanIdea idea clean build
para detectar as dependências novamente.fonte
Sei que essa não é a melhor resposta, mas se você não conseguir fazer o caminho de classe funcionar, essa é uma solução do plano B.
No meu caminho de classe de teste, adicionei a seguinte interface com uma implementação padrão para o método descrevMismatch.
fonte
Eu tenho um projeto gradle e quando minha seção de dependências build.gradle se parece com isso:
isso leva a esta exceção:
Para corrigir esse problema, substituí "mockito-all" por "mockito-core".
A explicação entre mockito-all e mockito-core pode ser encontrada aqui: https://solidsoft.wordpress.com/2012/09/11/beyond-the-mockito-refcard-part-3-mockito-core-vs-mockito -todos os projetos baseados em graduação /
fonte
No meu caso, tive que excluir um hamcrest mais antigo do junit-vintage:
fonte
Isso funcionou para mim. Não há necessidade de excluir nada. Eu apenas usei
mockito-core
vezmockito-all
fonte