【问题标题】:SpringBootTest + JPA + Kafka - context is not loading properly during testingSpringBootTest + JPA + Kafka - 测试期间上下文未正确加载
【发布时间】:2020-03-21 22:44:34
【问题描述】:

我有包含 kafka 和 jpa 的 Spring Boot 应用程序。我使用 h2 作为我的内存数据库。对于每个测试类的执行,我不希望每个测试类都出现 kafka。我有 2 个测试类,一个是 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-data-jpa h2 spring-kafka spring-boot-test


    【解决方案1】:

    我能够解决这个问题。这个问题的原因是没有为其他测试正确加载弹簧上下文,因为我没有使用@SpringBootTest。我如何绕过错误并仅加载一次 Spring Boot 上下文是创建这样的基类。

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

    现在每个测试类都必须按照下面的代码扩展这个类。这样,只有在测试运行期间上下文没有改变时,才会加载一次 spring 测试。

    public class MyTest  extends AbstractSpringBootTest {
    

    发布对我有用的解决方案以供其他人参考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-17
      • 2012-05-13
      • 1970-01-01
      • 2012-07-21
      • 2016-12-10
      • 2015-04-04
      • 1970-01-01
      • 2019-06-14
      相关资源
      最近更新 更多