我尝试在GitHub Actions中创建一个工作流,在我的Spring Boot 项目中运行我的集成测试,该项目用Kotlin编写,使用gradle打包,并使用mysql数据库。当到达构建和测试步骤时,我不断收到此错误,对于每个测试,运行./gradlew clean build
:
Caused by: java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:98
Caused by: org.springframework.beans.factory.BeanCreationException at AbstractAutowireCapableBeanFactory.java:1804
Caused by: javax.persistence.PersistenceException at AbstractEntityManagerFactoryBean.java:421
Caused by: org.hibernate.exception.JDBCConnectionException at SQLStateConversionDelegate.java:112
Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException at SQLError.java:174
Caused by: com.mysql.cj.exceptions.CJCommunicationsException at NativeConstructorAccessorImpl.java:-2
Caused by: java.net.ConnectException at PlainSocketImpl.java:-2
下面是我的gradle.yml
:
name: CI with Gradle
on: [push]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
container: openjdk:11
services:
mysql:
image: mysql:latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build & Test with Gradle
uses: gradle/gradle-build-action@v2
with:
arguments: build
下面是我的application.properties
:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/wct?useSSL=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=pw
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database=mysql
server.port=8081
下面是我所有失败的JUnit测试之一的示例:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
internal class CustomerControllerTests(
@Autowired val context: WebApplicationContext,
@Autowired val mapper: ObjectMapper,
@Autowired val customerRepository: CustomerRepository,
) {
private val mvc: MockMvc = (MockMvcBuilders.webAppContextSetup(context).apply<DefaultMockMvcBuilder>(
SecurityMockMvcConfigurers.springSecurity()).build())
@Test
fun `GET customers should return an empty list of customers and 200 OK if one of the required roles is provided`() {
val response = mvc.perform(
MockMvcRequestBuilders.get("/customers")
.contentType(MediaType.APPLICATION_JSON)
).andExpect(MockMvcResultMatchers.status().isOk).andReturn().response
response.contentLength shouldBe 0
}
}
我在这里做错了什么/错过了什么?
1条答案
按热度按时间5lhxktic1#
我发现您的设置中至少存在四个问题:
1.数据源URL不正确
您使用
localhost:3306
作为连接url(spring.datasource.url
)中的<hostname>:<port>
,但根据GitHub操作文档:当您在容器中运行作业时,GitHub会使用Docker的用户定义桥接网络将服务容器连接到作业。
在容器中运行作业和服务可简化网络访问。您可以使用在工作流中配置的标签访问服务容器。服务容器的主机名会自动Map到标签名称。
因此,在您的情况下,测试的url属性应该如下所示:
2.缺少MySql根密码
根据MySql Official Docker image page和GitHub Actions MySql设置的众多示例,您必须指定至少一个强制性env变量,即
MYSQL_ROOT_PASSWORD
:此变量是必需的,它指定将为MySQL root超级用户帐户设置的密码。
在您的情况下,将如下所示(在mysql服务的env块中):
3.未创建请求的数据库
从连接字符串中可以看到,您正在尝试连接到
wct
数据库,但我没有看到该数据库正在您的配置中创建。要做到这一点,您必须根据MySql Official Docker image page使用MYSQL_DATABASE
env变量。在env块中,它将如下所示:4.在MySql启动之前不等待它
根据官方的GitHub Actions Postgres示例,你最好等到你的MySql示例准备好为请求提供服务。
因此,假设您在测试中使用
root
用户(根据您的代码),您的最终“gradle.yml
“mysql部分将如下所示:不要忘记修复上面第一个“不正确的数据源URL”问题中概述的
spring.datasource.url
。同时,我相信它必须涵盖所有问题,或者至少是你配置中的主要问题。但是如果一些小的配置错误没有包含在这个答案中,我不会不感到惊讶。你可以让我知道它的进展。