unitarias unitaria tutorial test pruebas prueba espaƱol ejemplos ejemplo configuracion con assertequals java junit4 inner-classes testcase

java - tutorial - prueba unitaria con junit



Casos de prueba en clases internas con JUnit (5)

Leí acerca de las Pruebas de unidades de estructuración al tener una clase de prueba por clase y una clase interna por método. Pensé que parecía una forma práctica de organizar las pruebas, así que lo probé en nuestro proyecto Java. Sin embargo, las pruebas en las clases internas no parecen ser recogidas en absoluto.

Lo hice más o menos así:

public class DogTests { public class BarkTests { @Test public void quietBark_IsAtLeastAudible() { } @Test public void loudBark_ScaresAveragePerson() { } } public class EatTests { @Test public void normalFood_IsEaten() { } @Test public void badFood_ThrowsFit() { } } }

¿JUnit no es compatible con esto, o lo estoy haciendo mal?


Creo que algunas de las respuestas podrían ser para versiones anteriores de JUnit. En JUnit 4 esto funcionó para mí:

@RunWith(DogTests.class) @SuiteClasses({ DogTests.BarkTests.class, DogTests.EatTests.class }) public class DogTests extends Suite { public DogTests(Class<?> klass, RunnerBuilder builder) throws InitializationError { super(klass, builder); } public static class BarkTests { @Test public void quietBark_IsAtLeastAudible() { } @Test public void loudBark_ScaresAveragePerson() { } } public static class EatTests { @Test public void normalFood_IsEaten() { } @Test public void badFood_ThrowsFit() { } } }


Debes anonotar tu clase con @RunWith(Enclosed.class) , y como otros dijeron, declarar las clases internas como estáticas:

@RunWith(Enclosed.class) public class DogTests { public static class BarkTests { @Test public void quietBark_IsAtLeastAudible() { } @Test public void loudBark_ScaresAveragePerson() { } } public static class EatTests { @Test public void normalFood_IsEaten() { } @Test public void badFood_ThrowsFit() { } } }


En JUnit 5, simplemente marca las clases internas no estáticas como @Nested :

import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; public class DogTests { @Nested public class BarkTests { @Test public void quietBark_IsAtLeastAudible() { } @Test public void loudBark_ScaresAveragePerson() { } } @Nested public class EatTests { @Test public void normalFood_IsEaten() { } @Test public void badFood_ThrowsFit() { } } }


También he tenido éxito con Nested Runner de Nitor Creation .

Cómo utilizar el corredor anidado de Nitor Creation

Hay una publicación que lo explica aquí :

Agrega esta dependencia:

<dependency> <groupId>com.nitorcreations</groupId> <artifactId>junit-runners</artifactId> <version>1.2</version> <scope>test</scope> </dependency>

Y un @RunWith para su prueba:

import com.nitorcreations.junit.runners.NestedRunner import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import static org.junit.Assert.*; @RunWith(NestedRunner.class) public class RepositoryUserServiceTest { public class RegisterNewUserAccount { public class WhenUserUsesSocialSignIn { public class WhenUserAccountIsFoundWithEmailAddress { @Test public void shouldThrowException() { assertTrue(true); } } } } }

PD: el código de ejemplo se ha tomado y modificado de la publicación de blog anterior


public class ServicesTest extends TestBase { public static class TestLogon{ @Test public void testLogonRequest() throws Exception { //My Test Code } } }

Hacer la clase interna estática funciona para mí.