SpringBootTest + JPA + Kafka - 测试期间上下文未正确加载

SpringBootTest + JPA + Kafka - context is not loading properly during testing

我有 Spring 启动应用程序,里面有 kafka 和 jpa。我使用 h2 作为我的内存数据库。对于每个测试 class 执行,我不希望 kafka 出现在每个测试 class 中。我有 2 个测试 classes,一个是 KafkaConsumerTest,另一个是 JPATest。 KafkaConsumerTest 带有 @SpringBootTest 注释,它完美地加载了整个应用程序并通过了所有测试。但是,对于 JPATest,我不想调出整个应用程序和几个所需的上下文来测试与 JPA 相关的更改。当我这样做时,它会抛出以下异常。

Caused by: java.lang.IllegalArgumentException: dataSource or dataSourceClassName or jdbcUrl is required.
at com.zaxxer.hikari.HikariConfig.validate(HikariConfig.java:958)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:109)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:138)
at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:172)
at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.setOrDetectDatasource(DatabaseSessionImpl.java:233)
at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:815)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:256)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:769)

我在 application.yml 文件中使用 jdbcUrl 传递数据源

src/test/resources/application.yml

spring:
   datasource:
      jdbcUrl: jdbc:h2:mem:mydb
      url: jdbc:h2:mem:mydb
      driverClassName: org.h2.Driver
      username: sa
   kafka:
     bootstrap-servers: ${spring.embedded.kafka.brokers}

KafkaConsumerTest.java

@RunWith(SpringRunner.class)
@SpringBootTest (classes = Application.class)
@DirtiesContext
@EmbeddedKafka(partitions = 1,
                topics = {"${kafka.topic}"})
public class KafkaConsumerTest {

JpaTest.java

@RunWith(SpringRunner.class)
@ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class, classes = {JPAConfiguration.class})
public class NotificationServiceTest {

我尝试将加载程序设置为 AnnotationConfigContextLoader.class,但它给了我同样的错误。我尝试使用 TestPropertyResource 专门指定 application.yml,但仍然出现相同的错误。

@TestPropertyResource(locations = {"classpath:application.yml"})

我想我无法在此处正确加载上下文,并且 application.yml 文件无法在此处选择或解析值。

关于如何解决这个问题的任何建议。

我能够解决这个问题。这个问题的原因是 spring 上下文没有为其他测试正确加载,因为我没有使用 @SpringBootTest。我如何绕过错误并只加载 spring 引导上下文一次是创建一个像这样的基础 class。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@DirtiesContext
@EmbeddedKafka(partitions = 1,
        topics = {"${kafka.topic}"})
public abstract class AbstractSpringBootTest {
}

现在每个测试 class 都必须按照以下代码扩展此 class。这样 spring 测试将被加载一次,前提是上下文在测试期间没有改变 运行。

public class MyTest  extends AbstractSpringBootTest {

贴出对我有效的解决方案,供其他人参考。