Testfälle in inneren Klassen mit JUnit

Lesezeit: 4 Minuten

Benutzer-Avatar
Schiss

ich lese über Unit-Tests strukturieren mit einer Testklasse pro Klasse und einer inneren Klasse pro Methode. Ich dachte mir, dass dies ein praktischer Weg wäre, um die Tests zu organisieren, also habe ich es in unserem Java-Projekt ausprobiert. Allerdings scheinen die Tests in den inneren Klassen überhaupt nicht abgeholt zu werden.

Ich habe es ungefähr so ​​gemacht:

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

Unterstützt JUnit dies nicht oder mache ich es einfach falsch?

  • Ich denke, wenn Sie die inneren Klassen deklarieren statices sollte funktionieren.

    – Stefan

    6. Januar 2012 um 13:16 Uhr

  • Siehe hier: stackoverflow.com/questions/4150490/…

    – ähm

    6. Januar 2012 um 13:20 Uhr

Sie sollten Ihre Klasse mit kommentieren @RunWith(Enclosed.class)und wie andere sagten, deklarieren Sie die inneren Klassen als statisch:

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

  • Sie können immer noch nur 1 Kurs gleichzeitig durchführen.

    – Sridhar Sarnobat

    24. Januar 2017 um 23:41 Uhr

  • Funktioniert bei mir. Zumindest in Intellij kann ich entweder alle Tests, nur Tests einer untergeordneten Klasse oder einen einzelnen Test ausführen. Mit Codefaltung ist das wirklich schön!

    – Willey

    3. Februar 2017 um 14:06 Uhr

  • Führt alle Tests für mich mit Eclipse Neon und JUnit 4.12 aus. Eclipse fordert auch auf, das äußere Fixture oder eines der verschachtelten Fixtures auszuführen. Das einzige Problem, das ich habe, ist, dass Tests von den verschachtelten Fixtures zweimal ausgeführt werden, wenn sie von Gradle ausgeführt werden. GRADLE-2843 wurde für diese Ausgabe im Jahr 2013 eröffnet, wurde aber inzwischen aufgegeben.

    – Rusty Shackleford

    31. Mai 2017 um 1:45 Uhr

  • Beachten Sie auch, dass die innere Klasse öffentlich sein muss.

    – tkruse

    28. Februar 2019 um 8:22 Uhr

  • Dies scheint veraltet zu sein – siehe stackoverflow.com/a/22546453/5209935

    – Matthew

    24. April 2020 um 8:26 Uhr

public class ServicesTest extends TestBase {

   public static class TestLogon{

       @Test
       public void testLogonRequest() throws Exception {
         //My Test Code
       }
   }
}

Die innere Klasse statisch zu machen, funktioniert für mich.

  • Sie können immer noch nur 1 Kurs gleichzeitig durchführen.

    – Sridhar Sarnobat

    24. Januar 2017 um 23:41 Uhr

  • @Sridhar-Sarnobat Wovon redest du? Es funktioniert mindestens in JUnit 4.12. Kann mir aber nicht die Mühe machen, ältere Versionen zu testen.

    – Adowrath

    31. Januar 2017 um 7:44 Uhr

  • Wenn Sie Gradle verwenden, tun Sie auch a ./gradlew clean schien für mich zu funktionieren (glaube ich)

    – Dylanthepiguy

    18. April 2019 um 5:31 Uhr

In JUnit 5 markieren Sie einfach nicht statische innere Klassen als @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() { }
    }
}

  • Dies ist die aktuellste Antwort ab 2022. Es ist auch der beste Weg, um die ärgerliche Tatsache zu umgehen, dass @TestPropertySource von Spring nur auf Klassen angewendet werden kann.

    – Miguel Ruiz

    8. Juni um 21:22 Uhr


Benutzer-Avatar
Kai g

Ich denke, einige der Antworten könnten für ältere Versionen von JUnit gelten. In JUnit 4 hat das bei mir funktioniert:

    @RunWith(Suite.class)
    @Suite.SuiteClasses({ DogTests.BarkTests.class, DogTests.EatTests.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() { }
        }
    }

Benutzer-Avatar
Alvaro g

Ich hatte Erfolg mit Der Nested Runner von Nitor Creation auch.

So verwenden Sie den Nested Runner von Nitor Creation

Da ist ein Beitrag hier erklären:

Fügen Sie diese Abhängigkeit hinzu:

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

Und ein @RunWith zu deiner prüfung:

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: Der Beispielcode wurde aus dem obigen Blogbeitrag übernommen und modifiziert

  • Ich suchte nach einer Möglichkeit, ein spezifikationsähnliches Ding in JUnit erscheinen zu lassen … PERFEKT! Vielen Dank!

    – Toni K.

    30. März 2016 um 18:23 Uhr

  • Genau das, wonach ich gesucht habe!

    – Jeff Slavin

    30. März 2016 um 18:27 Uhr

  • Dies funktioniert auch mit Kotlin (use @RunWith(NestedRunner::class In diesem Fall).

    – x1a4

    3. September 2018 um 16:26 Uhr

  • Ich suchte nach einer Möglichkeit, ein spezifikationsähnliches Ding in JUnit erscheinen zu lassen … PERFEKT! Vielen Dank!

    – Toni K.

    30. März 2016 um 18:23 Uhr

  • Genau das, wonach ich gesucht habe!

    – Jeff Slavin

    30. März 2016 um 18:27 Uhr

  • Dies funktioniert auch mit Kotlin (use @RunWith(NestedRunner::class In diesem Fall).

    – x1a4

    3. September 2018 um 16:26 Uhr

1224550cookie-checkTestfälle in inneren Klassen mit JUnit

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy