Development Tip

JUnit을 사용한 내부 클래스의 테스트 케이스

yourdevel 2020. 12. 3. 20:43
반응형

JUnit을 사용한 내부 클래스의 테스트 케이스


클래스 당 테스트 클래스와 메서드 당 내부 클래스가있는 구조화 단위 테스트 에 대해 읽었습니다 . 테스트를 구성하는 편리한 방법 인 것 같아서 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이이를 지원하지 않거나 내가 잘못하고 있습니까?


public class ServicesTest extends TestBase {

   public static class TestLogon{

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

내부 클래스를 정적으로 만드는 것이 저에게 효과적입니다.


클래스를으로 주석 처리해야하며 @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() { }
  }
}

답변 중 일부는 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() { }
    }
}

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

I've had success with Nitor Creation's Nested Runner as well.

How to use Nitor Creation's Nested Runner

There is a post explaining it here:

Add this dependency:

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

And a @RunWith to your 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: The example code has been taken and modified from the above blog post

참고URL : https://stackoverflow.com/questions/8758294/test-cases-in-inner-classes-with-junit

반응형