在集成测试期间将 json 加载到数据库中
Loading json into the database during integration tests
我正在尝试编写一些集成测试 (Junit5),我需要从存储库中获取一些数据。我想在测试开始前用一些 json 数据(我想避免 sql)预填充数据库。
经过一些研究,我设法在我的资源文件夹中创建了 test-database.json 文件:
[
{
"_class": "com.marcellorvalle.scheduler.entity.Professional",
"id": 1,
"name": "James Holden"
},
{
"_class": "com.marcellorvalle.scheduler.entity.Professional",
"id": 2,
"name": "Gerald of Rivia"
},
{
"_class": "com.marcellorvalle.scheduler.entity.Professional",
"id": 3,
"name": "Christjen Avassalara"
}
]
还有配置文件:
@Configuration
public class TestConfiguration {
@Bean
public Jackson2RepositoryPopulatorFactoryBean getRepositoryPopulator() {
final Jackson2RepositoryPopulatorFactoryBean factory = new Jackson2RepositoryPopulatorFactoryBean();
factory.setResources(new Resource[]{new ClassPathResource("test-database.json")});
return factory;
}
}
我有一个虚拟测试只是为了检查是否一切正常:
@DataJpaTest
@ExtendWith(SpringExtension.class)
public class IntegrationTest {
final private ProfessionalRepository repository;
@Autowired
public IntegrationTest(ProfessionalRepository professionalRepository) {
repository = professionalRepository;
}
@Test
public void testFindAll() {
final List<Professional> result = repository.findAll();
Assertions.assertEquals(3, result.size());
}
}
当我 运行 测试时,它会失败并且没有结果。接下来,我将以下内容添加到 TestClass:
@ContextConfiguration(classes=TestConfiguration.class)
现在已加载 TestConfiguration,但无法解析 ProfessionalRepository:
org.junit.jupiter.api.extension.ParameterResolutionException: Failed to resolve parameter [com.marcellorvalle.scheduler.repository.ProfessionalRepository professionalRepository] (...) Failed to load ApplicationContext
有没有什么方法可以读取 TestConfiguration 而不会弄乱应用程序上下文?
您应该检查@ComponentScan("base-package-where-scan-starts'") 注释并将其放在您的 TestConfiguration
class
https://www.javarticles.com/2016/01/spring-componentscan-annotation-example.html
与其使用 @ContextConfiguration
擦除所有默认配置并用指定的 class 替换它们,不如尝试在 class 上使用 @Import
。这将汇总您的配置。
我正在尝试编写一些集成测试 (Junit5),我需要从存储库中获取一些数据。我想在测试开始前用一些 json 数据(我想避免 sql)预填充数据库。
经过一些研究,我设法在我的资源文件夹中创建了 test-database.json 文件:
[
{
"_class": "com.marcellorvalle.scheduler.entity.Professional",
"id": 1,
"name": "James Holden"
},
{
"_class": "com.marcellorvalle.scheduler.entity.Professional",
"id": 2,
"name": "Gerald of Rivia"
},
{
"_class": "com.marcellorvalle.scheduler.entity.Professional",
"id": 3,
"name": "Christjen Avassalara"
}
]
还有配置文件:
@Configuration
public class TestConfiguration {
@Bean
public Jackson2RepositoryPopulatorFactoryBean getRepositoryPopulator() {
final Jackson2RepositoryPopulatorFactoryBean factory = new Jackson2RepositoryPopulatorFactoryBean();
factory.setResources(new Resource[]{new ClassPathResource("test-database.json")});
return factory;
}
}
我有一个虚拟测试只是为了检查是否一切正常:
@DataJpaTest
@ExtendWith(SpringExtension.class)
public class IntegrationTest {
final private ProfessionalRepository repository;
@Autowired
public IntegrationTest(ProfessionalRepository professionalRepository) {
repository = professionalRepository;
}
@Test
public void testFindAll() {
final List<Professional> result = repository.findAll();
Assertions.assertEquals(3, result.size());
}
}
当我 运行 测试时,它会失败并且没有结果。接下来,我将以下内容添加到 TestClass:
@ContextConfiguration(classes=TestConfiguration.class)
现在已加载 TestConfiguration,但无法解析 ProfessionalRepository:
org.junit.jupiter.api.extension.ParameterResolutionException: Failed to resolve parameter [com.marcellorvalle.scheduler.repository.ProfessionalRepository professionalRepository] (...) Failed to load ApplicationContext
有没有什么方法可以读取 TestConfiguration 而不会弄乱应用程序上下文?
您应该检查@ComponentScan("base-package-where-scan-starts'") 注释并将其放在您的 TestConfiguration
class
https://www.javarticles.com/2016/01/spring-componentscan-annotation-example.html
与其使用 @ContextConfiguration
擦除所有默认配置并用指定的 class 替换它们,不如尝试在 class 上使用 @Import
。这将汇总您的配置。