Тестовые случаи во внутренних классах с JUnit - PullRequest
58 голосов
/ 06 января 2012

Я читал о Структурных модульных тестах с наличием класса тестирования для класса и внутреннего класса для метода.Я подумал, что это удобный способ организации тестов, поэтому я попробовал это в нашем Java-проекте.Тем не менее, тесты во внутренних классах, похоже, не выполняются вообще.

Я сделал это примерно так:

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 это, или япросто неправильно делаешь?

Ответы [ 5 ]

77 голосов
/ 01 марта 2013

Вы должны объявить свой класс с помощью @RunWith(Enclosed.class), и, как говорили другие, объявить внутренние классы как статические:

@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() { }
  }
}
26 голосов
/ 06 января 2012
public class ServicesTest extends TestBase {

   public static class TestLogon{

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

Создание статического внутреннего класса работает для меня.

9 голосов
/ 21 марта 2014

Я думаю, что некоторые ответы могут быть для более старых версий JUnit.В JUnit 4 это работало для меня:

@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() { }
    }
}
8 голосов
/ 10 ноября 2017

В JUnit 5 вы просто помечаете нестатические внутренние классы как @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 голосов
/ 27 октября 2015

У меня был успех с Вложенным раннером Nitor Creation .

Как использовать Nitor Creation Nested Runner

Здесь есть сообщение , объясняющее это :

Добавить эту зависимость:

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

И @RunWith к вашему тесту:

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: пример кода был взят и изменен из вышеприведенного сообщения в блоге

...