如果使用 Spring 和 Junit 4,如何编写内部测试类?或者我还能如何构建我的测试?

Posted

技术标签:

【中文标题】如果使用 Spring 和 Junit 4,如何编写内部测试类?或者我还能如何构建我的测试?【英文标题】:How to write inner test classes if you use Spring and Junit 4? Or How else I can structure my tests? 【发布时间】:2019-07-29 09:44:12 【问题描述】:

我有一个测试类,将来会测试不同的测试条件,我想让它更有条理,只适合一个文件。我找到了this 解决方案,但它不适合我,因为我无法将SpringRunner.classEnclosed.class 组合成一个@RunWith。我不能使用Nitor Creation's Nested Runner - 它带来了同样的问题。

我使用Spring 5Junit 4.12。嗯...我的问题是,如何将我的测试与几个内部/嵌套类与一个根类结合起来?

UPD:一句话 - 我无法升级到Junit 5

【问题讨论】:

【参考方案1】:

JUnit 4

如果您需要坚持使用 JUnit 4,您可以使用第三方插件来提供支持。请参阅 GitHub 上bechte 提供的junit-hierarchicalcontextrunner。

将依赖项添加到您的项目中,并像这样使用HeirachalContextRunner

@RunWith(HierarchicalContextRunner.class)
public class NestedTest 

    @ClassRule
    public static final SpringClassRule SPRING_CLASS_RULE = new SpringClassRule();

    @Rule
    public final SpringMethodRule  springMethodRule = new SpringMethodRule();

    @Before
    public void setup() 
        // General test-suite setup
    

    public class NestedClass 

        @Test
        public void testSomething() 
            // Test
        

        public class AnotherNestedClass 

            @Test
            public void testSomethingElse() 
                // Test
            
        
    

请注意,我们不需要在此处指定 Spring 的运行器。相反,我们使用这些规则来应用 Spring 测试框架,从 Spring 4.2 开始可用。

JUnit 5

可以说,升级到JUnit 5 是一种更具前瞻性的解决方案。然后,您可以使用@Nested 注释直接构建测试用例。见下文:

@SpringBootTest
@ExtendWith(SpringExtension.class)
class MyNestedTest 

    @BeforeAll
    void setup() 
        // General test-suite setup
    

    @Nested
    @DisplayName("parentTestSuite")
    class NestedClass 

        @Test
        void testSomething() 
            // Test
        

        @Nested
        @DisplayName("childTestSuite")
        class AnotherNestedClass 

            @Test
            void testSomethingElse() 
                // Test
            

        
    

请注意,@RunWith 已在 JUnit 5 中替换为 @ExtendWith。如果您选择迁移到 JUnit 5,您可能会发现阅读 Baeldung's guide on JUnit 5 migration 很有用。

【讨论】:

我无法升级到 Junit 5,我应该给它贴上标签。我喜欢这个解决方案,我会记住它。谢谢) @Woods 理解 - 请参阅我最近使用第三方库对 JUnit 4 兼容解决方案进行的编辑。 @Woods 需要注意的重要一点是,如果将 SpringRunner 替换为 Spring 的 JUnit 规则(在版本 4.2 中引入),则可以使用另一个跑步者。

以上是关于如果使用 Spring 和 Junit 4,如何编写内部测试类?或者我还能如何构建我的测试?的主要内容,如果未能解决你的问题,请参考以下文章

Spring与junit4集成测试

如何在 Spring Boot 和 JUnit 测试中定义 spring.config.location?

Spring 3 和 JUnit 4(自动装配)

Spring MVC 和 Hibernate 使用 Junit 测试 DAO 层和 Service 层的步骤

如何在 JUnit 中加载应用程序上下文并使用 Autowired

如何使用 Mockito 和 JUnit 在 Spring Boot 中测试 POST 方法