web-dev-qa-db-fra.com

Cas de test dans les classes internes avec JUnit

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?

60
Svish
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.

28
n3utrino

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() { }
  }
}
79
Theodor

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() { }
    }
}
10
Kai G

J'ai également eu du succès avec Nitor Creation's Nested Runner .

Comment utiliser le Nested Runner de Nitor Creation

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

8
alvaro g

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() { }
    }
}
8
heenenee