Java 配置Spring';重写默认应用程序上下文bean的s@DataJpaTest
我正在努力配置@DataJpaTest。我想利用@DataJpaTest提供的自动配置的spring上下文,但我想覆盖它的一些bean 这是我的主要课程:Java 配置Spring';重写默认应用程序上下文bean的s@DataJpaTest,java,spring,spring-boot,integration-testing,Java,Spring,Spring Boot,Integration Testing,我正在努力配置@DataJpaTest。我想利用@DataJpaTest提供的自动配置的spring上下文,但我想覆盖它的一些bean 这是我的主要课程: publicstaticvoidmain(字符串[]args){ run(DemoApplication.class,args); } @豆子 公共命令行运行程序命令行运行程序(BookInputPort BookInputPort){ 返回参数->{ bookInputPort.addNewBook(newbookdto(“ABC”,“DE
publicstaticvoidmain(字符串[]args){
run(DemoApplication.class,args);
}
@豆子
公共命令行运行程序命令行运行程序(BookInputPort BookInputPort){
返回参数->{
bookInputPort.addNewBook(newbookdto(“ABC”,“DEF”));
bookInputPort.addNewBook(newbookdto(“GHI”、“JKL”);
bookInputPort.addNewBook(新BookDto(“MNO”、“PRS”);
};
}
您可以清楚地看到,我为CommandLineRunner提供了依赖于某些服务的实现
我还有一个测试:
@DataJpaTest
公共类图书存储测试{
public static final String TITLE=“钟声为谁而鸣”;
公共静态最终字符串AUTHOR=“海明威”;
@自动连线
私人书库;
@试验
公共void testRepository(){
Book save=bookRepository.save(新书(标题、作者));
assertEquals(标题,save.getTitle());
assertEquals(AUTHOR,save.getAuthor());
}
}
运行测试时,出现以下错误:
No qualifying bean of type 'com.example.demo.domain.book.ports.BookInputPort' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
这很有道理!自动配置测试仅为上下文的“切片”提供实现。显然缺少BookInputPort的实现。我在测试上下文中不需要此commandLineRunner。我可以创建一个不依赖于任何服务的commandLineRunner。
我可以尝试通过向测试类嵌套类中添加以下内容来解决此问题:
@TestConfiguration
静态类BookRepositoryTestConfiguration{
@豆子
CommandLineRunner CommandLineRunner(){
返回参数->{
};
}
}
这就解决了问题。有点如果我有更多这样的测试,我必须将这个嵌套类复制粘贴到每个测试类。这不是一个最佳的解决方案。
我试图将其外部化为可由@Import
这是配置类:
@配置
公共类MyTestConfiguration{
@豆子
公共命令行运行程序命令行运行程序(){
返回参数->{
};
}
}
但随后应用程序失败,并显示一条消息:
Invalid bean definition with name 'commandLineRunner' defined in com.example.demo.DemoApplication: Cannot register bean definition
我检查了该错误,其他人在本例中建议:
@DataJpaTest(properties=“spring.main.allow bean definition overriding=true”)
我做到了,我得到了:
No qualifying bean of type 'com.example.demo.domain.book.ports.BookInputPort' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
这正是我开始遇到的问题。
我采取了所有这些步骤,并发现自己在一开始的地方
你知道如何解决这个问题吗?我没有模糊的想法或线索。注释
@DataJpaTest
仅加载Spring Boot应用程序的JPA部分,应用程序上下文可能不会加载,因为您有@DataJpaTest
注释。尝试将@DataJpaTest
替换为@springbootest
根据:
默认情况下,用@DataJpaTest
注释的测试将使用嵌入式
内存中数据库(替换任何显式或通常自动配置的
数据源)。@AutoConfigureTestDatabase
注释可用于
覆盖这些设置。如果您希望加载完整的
应用程序配置,但使用嵌入式数据库,您应该
考虑<代码> @ SpRunBooTest<(代码)>结合<代码> @ AutoConfigureTestDatabase <代码>
而不是这个注释
注释
@DataJpaTest
仅加载Spring Boot应用程序的JPA部分,应用程序上下文可能未加载,因为您有@DataJpaTest
注释。尝试将@DataJpaTest
替换为@springbootest
根据:
默认情况下,用@DataJpaTest
注释的测试将使用嵌入式
内存中数据库(替换任何显式或通常自动配置的
数据源)。@AutoConfigureTestDatabase
注释可用于
覆盖这些设置。如果您希望加载完整的
应用程序配置,但使用嵌入式数据库,您应该
考虑<代码> @ SpRunBooTest<(代码)>结合<代码> @ AutoConfigureTestDatabase <代码>
而不是这个注释
在Spring引导测试类中,您可以这样做
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class YourClassTest {
@Autowired
private YourService yourService;
它确实加载了所有的服务,我使用它非常好
如何在一个环境而不是另一个环境中加载特定实体
@Profile
注释@Profile({“prod”})
放在您不想在测试运行中加载的实体/服务上,然后@Profile({“prod”,“test”})
放在您希望在test
和prod
环境中加载的实体/服务上test
配置文件运行test
。它不会加载不必要的实体
李>
@Profile
注释李>
在Spring引导测试类中,您可以这样做
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class YourClassTest {
@Autowired
private YourService yourService;
它确实加载了所有的服务,我使用它非常好
如何在一个环境而不是另一个环境中加载特定实体
@Profile
注释@Profile({“prod”})
放在您不想在测试运行中加载的实体/服务上,然后@Profile({“prod”,“test”})
放在您希望在test
和prod
环境中加载的实体/服务上test
配置文件运行test
。它不会加载不必要的实体
李>
@Profile
注释放在其他