java - JUnit 5对没有SpringBootApplication的子项目进行测试

标签 java spring-boot gradle spring-data-jpa junit-jupiter

特别是我有一个子项目,它属于一个多项目构建。
子项目没有自己的SpringBootApplication
经过研究,我发现在ClassPath中搜索@SpringBootConfiguration但是现在我无法再继续了,因为未找到DataSource中配置的application.yml

引发以下异常:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'de.acme.storage.DBConnectionTest': Unsatisfied dependency expressed through field 'dataSource'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@javax.inject.Inject()}

    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:596)
    ...

我的期望是看到输出:DataSource: HikariDataSource (HikariPool-1),如有关Spring Boot 2和Hikari的指南中所述。
但是,本指南对SpringBootApplication类中的“测试”感到满意。

我的错在哪里

该子项目的结构如下:
src
+---main
|   \---java
|   |   \---de
|   |       \---acme
|   |           \---storage
|   |               +---model
|   |               |       User.java
|   |               |       
|   |               \---mysql
|   |                       UserDAOImpl.java
|               
\---test
    +---java
    |   \---de
    |       \---acme
    |           \---storage
    |                   DBConnectionTest.java
    |                   TestConfig.java
    |                   
    \---resources
            application.yml

子项目的build.gradle:
plugins {
    id 'org.springframework.boot'
}

apply plugin: 'io.spring.dependency-management'

dependencies {
    implementation project(':api'),
            'javax.inject:javax.inject:1',
            'org.springframework.boot:spring-boot-starter-data-jpa'

    runtime 'mysql:mysql-connector-java'
}

主项目中的build.gradle包含以下依赖项部分:
dependencies {
    implementation 'org.slf4j:slf4j-api'

    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'junit', module: 'junit' //by both name and group
    }
    testImplementation 'org.junit.jupiter:junit-jupiter-api',
            'org.junit.jupiter:junit-jupiter-params'

    testRuntime 'org.junit.jupiter:junit-jupiter-engine'
}

application.yml内容:
spring:
  datasource:
    url: jdbc:mysql://localhost:13306/testdb
    username: test-user
    password: geheim
  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQLDialect
        format_sql: true
        id:
          new_generator_mappings: false

JUnit测试:
@SpringBootTest
class DBConnectionTest {
    private static final Logger LOG = LoggerFactory.getLogger(DBConnectionTest.class);

    @Inject
    private DataSource dataSource;

    @Test
    void test() {
        LOG.debug("DataSource: {}", dataSource);
        assertThat(dataSource).as("Es gibt eine Datasource").isNotNull();
    }
}

最后是带有@SpringBootConfiguration注释的空配置:
package de.acme.storage;

import org.springframework.boot.SpringBootConfiguration;

@SpringBootConfiguration
class TestConfig {
}

最佳答案

仅缺少一件事,即注释@EnableAutoConfiguration。以为这可以通过@SpringBootConfiguration完成...

package de.acme.storage;

import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;

@SpringBootConfiguration
@EnableAutoConfiguration
class TestConfig {
}

关于java - JUnit 5对没有SpringBootApplication的子项目进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55602641/

相关文章:

java - 解析 Jar 文件并查找类之间的关系?

java - Spring启动java.lang.ClassNotFoundException : org. hibernate.engine.jndi.JndiException

java - 由 : org. apache.camel.NoTypeConversionAvailableException 引起:没有可用于从类型 POJO 转换为 byte[] 的类型转换器

macos - 无法执行没有JRE捆绑的JavaFX应用程序

android gradle 本地路径不存在

java - 无法将 boolean 值设置为 null

java - Android Studio 支持@IntRange 和@FloatRange 等注解,为什么没有@DoubleRange 注解

gradle - 哪个 Maven BOM 确定 Gradle 5 中的依赖项版本?

java - 将具有不同 header 的大消息写入多个接收者的效率问题

java - 移动配置、实体和其他类