Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 配置Spring';重写默认应用程序上下文bean的s@DataJpaTest_Java_Spring_Spring Boot_Integration Testing - Fatal编程技术网

Java 配置Spring';重写默认应用程序上下文bean的s@DataJpaTest

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

我正在努力配置@DataJpaTest。我想利用@DataJpaTest提供的自动配置的spring上下文,但我想覆盖它的一些bean

这是我的主要课程:

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
    注释放在其他