Spring Boot Test 无法使用 JUnit 5 为自定义集成测试源集加载应用程序上下文
Posted
技术标签:
【中文标题】Spring Boot Test 无法使用 JUnit 5 为自定义集成测试源集加载应用程序上下文【英文标题】:Spring Boot Test fails to load application context with JUnit 5 for a custom integration test source set 【发布时间】:2021-05-09 06:46:31 【问题描述】:我想从我的 Spring Boot 后端服务的一些集成测试开始。因此我添加了一个 gradle 插件来帮助我添加 integrationTest
源集。
// build.gradle.kts
plugins
id("org.springframework.boot") version "2.4.2"
id("io.spring.dependency-management") version "1.0.11.RELEASE"
id("org.jlleitschuh.gradle.ktlint") version "9.4.1"
id("org.unbroken-dome.test-sets") version "3.0.1" // <<
kotlin("jvm") version "1.4.21"
kotlin("plugin.spring") version "1.4.21"
...
dependencies
testImplementation("org.springframework.boot:spring-boot-starter-test")
...
testSets
create("integrationTest")
...
然后我开始构建我的第一个测试规范:
// TeamApiIntegrationTest.kt
package com.myapp.integrationtest.api
import com.myapp.userservice.repository.TeamRepository
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.context.ContextConfiguration
import org.springframework.test.context.junit.jupiter.SpringExtension
@SpringBootTest
@ContextConfiguration(classes = [TeamRepository::class])
@ExtendWith(SpringExtension::class)
class TeamApiIntegrationTest @Autowired constructor(
private val teamRepository: TeamRepository
)
@Test
fun `should fetch a list of two teams where the current auth user is part of`()
assertThat(teamRepository).isNotNull
我收到的例外是这个:
Failed to resolve parameter [com.myapp.userservice.repository.TeamRepository teamRepository] in constructor [public com.myapp.integrationtest.api.TeamApiIntegrationTest(com.myapp.userservice.repository.TeamRepository)]: No qualifying bean of type 'com.myapp.userservice.repository.TeamRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations:
org.junit.jupiter.api.extension.ParameterResolutionException: Failed to resolve parameter [com.myapp.userservice.repository.TeamRepository teamRepository] in constructor [public com.myapp.integrationtest.api.TeamApiIntegrationTest(com.myapp.userservice.repository.TeamRepository)]: No qualifying bean of type 'com.myapp.userservice.repository.TeamRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations:
[...]
我理解这个问题,但不知道为什么会发生,因为我明确地将TeamRepository
“添加”到ContextConfiguration
。
编辑:
// TeamRepository.kt
import org.springframework.data.repository.PagingAndSortingRepository
import org.springframework.stereotype.Repository
@Repository()
interface TeamRepository : PagingAndSortingRepository<Team, String>
fun findByName(name: String): List<Team?>
fun findByUsers(user: User): List<Team?>
【问题讨论】:
请在此处添加TeamRepository
代码。你有 spring-boot-starter-test 依赖吗?
@Ice 我添加了相关信息
@ExtendWith 接受数组,所以@ExtendWith(value = [SpringExtension::class])
你的测试中有数据库配置吗?喜欢 h2 还是 testcontainers?
@Ice 我从 Spring Boot 2.1 开始阅读 @ExtendWith
不再需要。在我使用它的其他地方,它也可以在没有数组的情况下工作。是的,我有一个嵌入式测试数据库的配置。我在单元测试中使用了所有这些。但是从我在这里设置的集成测试源开始,似乎没有任何效果了
【参考方案1】:
您需要删除@SpringBootTest
。@SpringBootTest
将查找带有Junit 5
的实际配置。
我之前在 java 中遇到过同样的问题 你可以找到详情here
【讨论】:
以上是关于Spring Boot Test 无法使用 JUnit 5 为自定义集成测试源集加载应用程序上下文的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot Test 失败说,由于缺少 ServletWebServerFactory bean,无法启动 ServletWebServerApplicationContext
Spring Boot Test 失败说,由于缺少 ServletWebServerFactory bean,无法启动 ServletWebServerApplicationContext
Spring Boot 无法执行目标 org.apache.maven.plugins:maven-surefire-plugin:2.22.1:test
Angular 6 和 Spring boot - 无法使用简单的 HttpClient 调用获取数据