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í.