2010-11-11 10 views
9

Estoy teniendo algunos problemas en la definición de las clases internas en una clase de prueba heredado de TestCase, por JUnit 3. Escenario es como siguiente:error en la definición de las clases internas en una clase de prueba de JUnit

Foo.java

public class Foo { 
    public void method() { ... } 
} 

FooTest.java

public class FooTest extends TestCase { 
    public class Bar extends Foo { 
    public void method() { ... } 
    } 
    public void testMethod() { ... } 
} 

Ahora, si me quedo esto desde Eclipse, las pruebas se ejecutan bien, pero si trato de ejecutar una tarea de hormiga que falla:

[junit] junit.framework.AssertionFailedError: Clase Foo $ Bar tiene ningún constructor público TestCase (String name) o TestCase()

bar no es una clase de prueba, es sólo una subclase de Foo anulando algún método que No necesito hacer las cosas reales cuando estoy probando.

Estoy bastante perdido en este momento y no sé cómo abordar este problema. ¿Es la única forma de crear las subclases como independiente?

+0

¿Cuál es su configuración Ant para ejecutar pruebas? –

Respuesta

15

Esto se debe a que incluyó una clase anidada en el conjunto de archivos junit. Agregue una propiedad "exclude" a su build.xml.

Por ejemplo:

<target name="test" depends="test-compile"> 
    <junit> 
     <batchtest todir="${test.build.dir}" unless="testcase"> 
      <fileset dir="${test.build.classes}" 
       includes = "**/Test*.class" 
       excludes = "**/*$*.class"/> 
     </batchtest> 
    </junit> 
</target> 
+0

Esta es en realidad una mejor solución que @Ignore, ya que las clases internas no se muestran en absoluto en los archivos de resultados de prueba cuando están excluidos en build.xml. Ambas soluciones funcionan bien. – joscarsson

+0

Gracias por esta respuesta, me ayudaste a entender por qué la prueba junit de hormig no funcionaba solo porque tengo una clase interna privada. La declaración de exclusión hizo el truco. – JulianHarty

+0

Sucede que estoy usando un '' con un '' anidado con un 'refid'. No puede cambiar el '' pero aún puede poner un elemento '' dentro del '' para eliminar las clases internas que el '' haría ha incluido. –

5

Usted podría intentar definir la clase de barra como estática:

public class FooTest extends TestCase { 
    public static class Bar extends Foo { 
    public void method() { ... } 
    } 
    public void testMethod() { ... } 
} 

... pero el hecho de que funciona en un entorno y en otro no sugiere una de dos cosas:

  1. Java versión
  2. de rutas de clases
  3. [Editar: según lo sugerido por Jim abajo] diferentes versiones de junit.jar
+1

+1 Agregaría uno más: diferentes versiones de junit.jar. Es posible que la clase anidada no estática confunda una versión anterior de JUnit. –

4

Me siento como un necrposter, pero el problema es que me he encontrado con un problema similar con maven hoy.

Usual mvn test funciona bien pero cuando quiero ejecutar pruebas de un paquete específico como mvn test -Dtest=com.test.* - initializationError se lanza. Esto "funciona" tanto para Junit 3 como para 4.

Encontré el motivo de mi maven-case, esto puede ser lo mismo para hormiga. Lo que pasa es que el plugin de prueba de maven (surefire) considera solo el subconjunto específico de todas las clases como "clases de prueba", es decir, buscándolos por nombre, como * Prueba y más (puede leer sobre esto en surefire's home page) . Cuando definimos la propiedad test, anulamos por completo el comportamiento predeterminado. Esto significa que con -Dtest=com.test.* surefire recogerá no solo com.test.MyTestClass sino también com.test.MyTestClass.InnerClass e incluso com.test.MyTestClass$1 (es decir, clases anónimas).

Para ejecutar, por ejemplo, las clases de algún paquete deben usar algo como -Dtest=com.test.*Test (si usa sufijos para identificar clases de prueba por supuesto).

3

También puede realizar anotaciones en el @ignore clase anidada si no desea excluir todas las clases internas.

+1

Esto no funciona para clases internas anónimas. @Ignore Annotation no es válida aquí. –

+0

Cierto, pero la pregunta no era sobre clases internas anónimas. –

Cuestiones relacionadas