Test cases in inner classes with JUnit

前端 未结 5 604
故里飘歌
故里飘歌 2020-12-02 12:09

I read about Structuring Unit Tests with having a test class per class and an inner class per method. Figured that seemed like a handy way to organize the tests, so I tried

相关标签:
5条回答
  • 2020-12-02 12:23

    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

    0 讨论(0)
  • 2020-12-02 12:29
    public class ServicesTest extends TestBase {
    
       public static class TestLogon{
    
           @Test
           public void testLogonRequest() throws Exception {
             //My Test Code
           }
       }
    }
    

    Making the inner class static works for me.

    0 讨论(0)
  • 2020-12-02 12:34

    In JUnit 5, you simply mark non-static inner classes as @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() { }
        }
    }
    
    0 讨论(0)
  • 2020-12-02 12:35

    I think some of the answers might be for older versions of JUnit. In JUnit 4 this worked for me:

        @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() { }
            }
        }
    
    0 讨论(0)
  • 2020-12-02 12:43

    You should annontate your class with @RunWith(Enclosed.class), and like others said, declare the inner classes as static:

    @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() { }
      }
    }
    
    0 讨论(0)
提交回复
热议问题