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 调用获取数据

使用 JUnit 5 的 spring-boot-starter-test

Spring boot聚合项目mapper接口无法注入问题