J'ai lu Structuring Unit Tests avec une classe de test par classe et une classe interne par méthode. J'ai pensé que cela semblait être un moyen pratique d'organiser les tests, alors je l'ai essayé dans notre projet Java. Cependant, les tests dans les classes internes ne semblent pas du tout être récupérés.
Je l'ai fait à peu près comme ça:
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() { }
}
}
Est-ce que JUnit ne prend pas en charge cela, ou est-ce que je le fais mal?
public class ServicesTest extends TestBase {
public static class TestLogon{
@Test
public void testLogonRequest() throws Exception {
//My Test Code
}
}
}
Rendre la classe interne statique fonctionne pour moi.
Vous devez annoter votre classe avec @RunWith(Enclosed.class)
, et comme d'autres l'ont dit, déclarer les classes internes comme statiques:
@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() { }
}
}
Je pense que certaines des réponses pourraient être pour les anciennes versions de JUnit. Dans JUnit 4, cela a fonctionné pour moi:
@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() { }
}
}
J'ai également eu du succès avec Nitor Creation's Nested Runner .
Il y a un poste l'expliquant ici :
Ajoutez cette dépendance:
<dependency>
<groupId>com.nitorcreations</groupId>
<artifactId>junit-runners</artifactId>
<version>1.2</version>
<scope>test</scope>
</dependency>
Et un @RunWith
à votre test:
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);
}
}
}
}
}
PS: l'exemple de code a été repris et modifié à partir de l'article de blog ci-dessus
Dans JUnit 5, vous marquez simplement les classes internes non statiques comme @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() { }
}
}