我有带有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文件无法在此处选择或解析值。
有关如何解决此问题的任何建议。
答案 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 {
发布对我有用的解决方案,以供其他人参考。