我想在测试中覆盖application.properties
中定义的属性,但@TestPropertySource
只允许提供预定义的值。
我需要的是在一个随机端口N上启动一个服务器,然后将这个端口传递给spring-boot应用程序。这个端口必须是临时的,以便在同一个主机上同时运行多个测试。
我指的不是嵌入式http服务器(jetty),而是在测试开始时启动的其他服务器(例如zookeeper),被测应用程序必须连接到它。
实现这一目标的最佳途径是什么?
这里有一个类似的问题:
但是这些答案并没有提到临时端口的解决方案
4条答案
按热度按时间whhtz7ly1#
从Spring Framework 5.2.5和Sping Boot 2.2.6开始,您可以在测试中使用
Dynamic Properties
:piv4azn72#
由于Spring Framework 5.2.5中所做的更改,@ContextConfiguration和ApplicationContextInitializer的使用可以替换为静态的@DynamicPropertySource方法,用于相同的目的。
cbjzeqam3#
您可以在
@BeforeClass
中覆盖port属性的值,如下所示:aiazj4mn4#
“干净”的解决方案是使用
ApplicationContextInitializer
。请参阅this answer来回答类似的问题。
另请参见this github issue询问类似问题。
使用一个真实世界的例子来总结上面提到的帖子,这个例子已经被消毒以保护版权所有者(我有一个REST端点,它使用
@Autowired
DataSource
,它需要使用动态属性来知道内存中的MySQL数据库正在使用哪个端口):1.你的测试必须声明初始化器(参见下面的
@ContextConfiguration
行)。1.初始化器需要将动态属性添加到环境中。不要忘记为需要运行的任何清理添加一个关闭钩子。下面是一个使用自定义
DatabaseObject
类设置内存数据库的示例。当我查看日志时,它显示对于我使用这个初始化器类的两个测试,它们使用相同的对象(
initialize
方法只被调用一次,关闭钩子也是如此)。因此,它启动一个数据库,并让它运行,直到两个测试完成,然后关闭数据库。