如何 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 测试
rest-assured : Restful API 测试利器 - 真正的黑盒单元测试(跟Spring-Boot更配哦)