2009-11-30 14 views
6

intentar compilar el códigode Hamcrest no compila

import static org.hamcrest.Matchers.is; 
import static org.hamcrest.number.OrderingComparison.lessThan; 

... 

Assert.assertThat(0, is(lessThan(1))); 

problemas de este error de compilación:

assertThat(Object, org.hamcrest.Matcher<java.lang.Object>) cannot be applied to (int, org.hamcrest.Matcher<capture<? super java.lang.Integer>>)

podría ser esto colisiones entre diferentes versiones hamcrest? Estoy usando jUnit 4.6 y Hamcrest 1.3

+0

No será un conflicto si solo tiene una copia de Hamcrest. ¿Qué versiones de JUnit y Hamcrest tienes? Recuerde, las versiones posteriores de JUnit incluyen su propia copia de bits de Hamcrest. – skaffman

+0

Recientemente agregué hamcrest, después de solo usar jUnit antes de eso. Es posible que el hamcrest que viene con jUnit sea más antiguo y deba actualizarse. – ripper234

Respuesta

1

No uso Hamcrest, pero obviamente int no es un Objeto. Use Integer en su lugar, p.

Assert.assertThat(Integer.valueOf(0), is(lessThan(1))); 

supongo que está utilizando la versión de Java < = 1.4, donde auto-boxing no funciona. Por lo tanto, primero necesita una conversión explícita a Integer.

+0

Java 1.6 y agregar conversiones a Entero no resuelve nada. Ah, y gracias por el voto negativo de una pregunta legítima (asumiendo que eras tú, si no la retiré). – ripper234

+0

No creo que alguien brinde una respuesta y menosprecia la pregunta. Supongo que fue otra persona. +1 de mí, solo porque no entiendo el voto negativo no comentado también. –

+0

Acabo de probar con JDK 6, hamcrest-all-1.2.jar y junit-4.7.jar y compila muy bien. Preste atención para usar org.junit.Assert, not junit.framework.Assert. Y tenga cuidado con insultar a las personas que simplemente intentan ayudarlo, incluso si votaron negativamente (lo que yo no hice). – sfussenegger

0

Es un problema muy extraño. Creo que necesitamos más información, ya que debería funcionar correctamente. Traté de reproducirlo usando JUnit 4.4 y Hamcrest 1.1 (un poco más antiguo, pero eso es lo que estoy usando en mi proyecto actual, así que fue fácil de probar) y funcionó perfectamente.

La única diferencia que noté es que mi Eclipse importó org.hamcrest.Matchers.lessThan en lugar de org.hamcrest.number.OrderingComparisons.lessThan, pero cuando utilicé este último también funcionó a la perfección.

Puede deberse al hecho de que utiliza una versión anterior de Hamcrest o JUnit (¿qué versiones está usando en realidad? No lo mencionó aún). Lo que es extraño es el hecho de que tienes un error incluso cuando agregaste un lanzamiento explícito al Integer. Eso es interesante, y podría ser útil cuando publique este error ...

De todos modos, debería funcionar perfectamente ya que no hay errores de sintaxis o algo así, por lo que su configuración debe ser la causa del problema.

+0

Tengo junit 4.6 y hamcrest 1.3 – ripper234

1

Creo que tal vez el problema es su método assertThat. Si dice,

void assertThat(Object item, Matcher<Object> matcher) { ... } 

entonces usted necesita para cambiarlo a:

void <T> assertThat(T item, Matcher<? super T> matcher) { ... } 

Tal vez su biblioteca JUnit está desfasado en comparación con su biblioteca Hamcrest? ¿Los construiste tú mismo? ¿Es posible que tenga varias copias de JUnit o Hamcrest en su classpath?

5

Creo que el problema es que JUnit viene incluido con una copia anterior de Hamcrest (1.1) ya que las firmas en la versión posterior de Hamcrest son incompatibles con JUnit. Hay dos soluciones posibles:

  1. Elimine su versión de Hamcrest (1.3) del classpath, y utilice la copia incluida con JUnit.
  2. utilizar una versión diferente liberación de JUnit (creo que los frascos se nombran como 'junit-dep-xxx.jar) que no incluye Hamcrest
  3. Cambio llamadas de org.junit.Assert.assertThat() a org.hamcrest.MatcherAssert.assertThat() ` .

Este último es probablemente mi opción recomendada, ya que la versión Hamcrest de assertThat() produce mensajes de error más agradable, y versiones posteriores a la 1.1 tienen algunas características interesantes (por ejemplo,TypeSafeDiagnosingMatcher).

Cuestiones relacionadas