Java 如何在SpringBootTest中添加bean

Java 如何在SpringBootTest中添加bean,java,spring,spring-boot,unit-testing,Java,Spring,Spring Boot,Unit Testing,这个问题看起来非常简单,但奇怪的是我没有找到解决办法 我的问题是关于在SpringBootTest中添加/声明bean,而不是重写bean,也不是使用mockito模拟bean 以下是我在尝试实现我真正需要的最简单实现时得到的结果(但它不起作用): 一些服务、bean和配置: @Value // lombok public class MyService { private String name; } 测试: @RunWith(SpringRunner.class) @Spri

这个问题看起来非常简单,但奇怪的是我没有找到解决办法

我的问题是关于在
SpringBootTest
中添加/声明bean,而不是重写bean,也不是使用mockito模拟bean

以下是我在尝试实现我真正需要的最简单实现时得到的结果(但它不起作用):

一些服务、bean和配置:

@Value // lombok
public class MyService {
    private String name;
}



测试:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = { SomeSpringConfig.class })
public class SomeSpringConfigTest {

    private String testValue = "testServiceName";

    // this bean is not used
    @Bean
    public MyService monitoringService(){ return new MyService(testValue); }

    // thus this bean cannot be constructed using SomeSpringConfig 
    @Autowired
    public MyClass myClass;

    @Test
    public void theTest(){
        assert(myClass.getMonitoring().getName() == testValue);
    }
}
现在,如果我将
@Bean public-MyService-monitoring(){…}
替换为
@MockBean-public-MyService-monitoring,它可以工作。我觉得很奇怪,我可以轻松地模仿一个bean,但不能简单地提供它

=>那么我应该如何为一个测试添加自己的bean呢

编辑:

  • 我认为(创建一个配置测试类)是一般的建议
  • 但是,(使用@ContextConfiguration)更符合我的要求,即直接在测试类中添加@Bean

只需将配置添加为

@ContextHierarchy({
    @ContextConfiguration(classes = SomeSpringConfig.class)
})

Spring测试需要知道您正在使用什么配置(以及在何处扫描加载的bean)。为了实现你的目标,你有更多的选择,最基本的是以下两个:

  • 在包含bean的测试类之外创建配置类

    @Configuration
    public class TestConfig {
    
        @Bean
        public MyService monitoringService() {
            return new MyService();
        }
    }
    
  • 然后将其作为配置类
    @SpringBootTest(class={SomeSpringConfig.class,TestConfig.class})添加到测试中

  • 若您只需要在这个特定的测试中使用这个配置,那个么您可以在静态内部类中定义它

    public class SomeSpringConfigTest {
    
        @Configuration
        static class ContextConfiguration {
    
            @Bean
            public MyService monitoringService() {
                return new MyService();
            }
        }
    }
    

  • 这将由spring boot test自动识别和加载

    您的测试类不是配置类,因此在其中放置
    @Bean
    方法不会有任何作用。我尝试在测试类之前添加
    @configuration
    ,但它不起作用…只需创建新的配置类(不是在src中,而是在test文件夹中)类似于
    SomeSpringConfig
    定义bean,然后将其包含在
    @springbootest(classes={SomeSpringConfig.class,AnotherConfig.class})
    中。它确实有效(您可以给出答案)。但是,创建一个新的配置类似乎太难了,尤其是在添加模拟bean非常简单的情况下。我错了?
    @MockBean
    是特别的,你为什么想要/需要一个
    @Configuration
    类呢?它与你的代码一起工作,但使用测试类(SomeSpringConfigTest)。但是它可以简化为类定义之前的
    @ContextConfiguration(classes=SomeSpringConfigTest.class)
    。I.no@ContextHierarchy.也许你应该添加一点关于这些装饰是怎么做的解释,从而说明它是如何满足我的要求的?
    @Configuration
    public class TestConfig {
    
        @Bean
        public MyService monitoringService() {
            return new MyService();
        }
    }
    
    public class SomeSpringConfigTest {
    
        @Configuration
        static class ContextConfiguration {
    
            @Bean
            public MyService monitoringService() {
                return new MyService();
            }
        }
    }