我有一个春季启动应用程序,其中包含以下application.properties
:
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@ldap:something
spring.datasource.username=${USERNAME}
spring.datasource.password=${PASSWORD}
如您所见,它取决于一些环境变量。我的最终目的地是码头图像,但在此之前我运行gradle build
任务 - 当然,它失败了,因为它在环境变量中找不到USERNAME
和PASSWORD
。
因此,我想将我的问题分成两部分:
gradle test
一起执行的gradle build
任务是否应该尝试测试数据库连接?它在默认尝试引导spring引导应用程序时会这样做 - 这就是我的gradle build
任务失败的原因。不知何故,我认为这不是最佳选择 - 因为在我看来,单元测试不应该依赖于任何外部因素,例如数据库连接。gradle build
然后运行docker build
是个好主意吗?或者一切都应该一气呵成?然后我至少可以在docker run
上定义环境变量。但话说回来,我不想在不知道构建完好并且所有测试都已通过的情况下构建docker镜像。“这是一个好主意”的问题很难回答,但我会尝试......
回答你的问题:
gradle test
应该在gradle build
之后执行。除非您的数据库测试是其中一项测试,否则如果您只使用它来收集测试信息,我会在数据库检查后执行gradle test
。docker build
第二,docker run -e USERNAME=XXXX -e PASSWORD=XXXX...
第三,gradle build
在码头工人。首先,您应该问自己是否真的需要为测试引导整个应用程序。如果您有一个测试,检查某些方法是否为不需要数据库调用的给定输入生成正确的输出,您可能不需要它。
即使测试需要数据库连接,您也应该问自己它是否应该是实际的数据库。如果您依赖单独的数据库进行测试,那么这也意味着如果对数据库进行任何维护,整个构建过程将会失败。也许最好使用单独的内存数据库进行测试。
要实现这一点,您可以将内存数据库(如HSQLDB)作为测试依赖项添加到项目中:
testCompile("org.hsqldb:hsqldb")
之后,您可以提供单独的application-test.properties
文件:
spring.datasource.url=jdbc:hsqldb:mem
spring.datasource.username=user
spring.datasource.password=pass
现在,您可以注释需要与@ActiveProfiles("test")
建立数据库连接的任何测试。
即使您不喜欢用于测试目的的内存数据库,您仍然可以使用使用多个配置文件的方法来为您的测试使用不同的数据库配置(例如,硬编码连接+数据库的用户名/密码)。