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

时间:2019-11-26 13:37:09

标签: spring-data-jpa h2 spring-kafka spring-boot-test

我有带有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 {

我尝试将loader作为AnnotationConfigContextLoader.class放置,但它给了我同样的错误。我尝试仅使用TestPropertyResource指定application.yml,但仍然是相同的错误。

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

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

有关如何解决此问题的任何建议。

1 个答案:

答案 0 :(得分:0)

我能够解决问题。这个问题的原因是由于我没有使用@ SpringBootTest,Spring上下文没有为其他测试正确加载。我如何绕过该错误并仅一次加载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 {

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