如何 JUnit 测试 Spring-Boot 的 Application.java

Posted

技术标签:

【中文标题】如何 JUnit 测试 Spring-Boot 的 Application.java【英文标题】:How to JUnit Test Spring-Boot's Application.java 【发布时间】:2017-06-06 02:54:23 【问题描述】:

道歉,因为这似乎是一个无用的行为,但是我们有什么办法可以在 Spring-Boot(1.3.8.RELEASE) 的 Application.java 上实际进行 junit 测试,这个类除了启动一个Spring-boot 应用程序?

如下:

@SpringBootApplication
public class Application 

    public static void main(String[] args) 

       try
             SpringApplication.run(Application.class, args);
       catch(Exception e)
             //code here
          
    

也许我可以尝试捕获异常?但是我还能测试什么以便 JUnit 测试 SpringApplication.run()?任何例子都值得赞赏。谢谢大家!

【问题讨论】:

【参考方案1】:

通常,以下内容足以测试应用程序上下文是否启动。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class ApplicationTests 

    @Test
    public void contextLoads() 
    

不过,如果你想直接测试Application.main,你也可以这样测试:

public class ApplicationTest 

    @Test
    public void test()
    
        Application.main(new String[]
                "--spring.main.web-environment=false",
                "--spring.autoconfigure.exclude=blahblahblah",
                // Override any other environment properties according to your needs
        );
    

【讨论】:

这正是声纳测试的内容...非常感谢,我希望更多的人会看到这个结果! 如果我没记错的话,如果只有一个带有@SpringBootApplication 的类,那么这个类将被采用,不需要进一步声明。否则测试无法知道 SpringBootApplication 启动。【参考方案2】:

也许我可以尝试捕获异常?但我还能测试什么 以便 JUnit 测试 SpringApplication.run()?任何例子都是 赞赏。谢谢大家!

如果捕获到异常则使测试失败在这里是无助的,因为在测试期间抛出的异常已经导致测试失败(更准确地说是错误)。 如果您已经执行了加载整个 Spring Boot 上下文 (@SpringBootTest) 的测试类,则无需编写测试来检查它是否已正确加载。

你应该测试Application 类是否有一些逻辑。 例如,您可以声明一个使用@Before 注释的方法,该方法在加载上下文后进行一些处理,并且您希望断言处理已按应有的方式完成。其他示例:您可以在 main() 方法中传递一些参数,并且您希望断言该方法按预期使用了这些参数。 所有这些都可以使用@SpringBootTest 进行测试。

如果你的 Application 班级除了:

 public static void main(String[] args)                    
   SpringApplication.run(Application.class, args);         
 

但是您需要同样覆盖main() 测试方法以符合某些覆盖工具或组织,为此创建一个集成测试,清楚地记录它并让集成持续进行,因为加载 Spring Boot 应用程序需要时间。可以参考这个question。

【讨论】:

以上是关于如何 JUnit 测试 Spring-Boot 的 Application.java的主要内容,如果未能解决你的问题,请参考以下文章

如何在spring-boot应用程序的junit中调用ApplicationContextInitializer

Spring-boot,使用不同配置文件的 JUnit 测试

spring-boot2.0 单元测试JUnit4

Spring Boot 中的测试:JUnit

rest-assured : Restful API 测试利器 - 真正的黑盒单元测试(跟Spring-Boot更配哦)

在 junit 测试中禁用 RedisHttpSessionConfiguration