gpt4 book ai didi

java - 如何在SpringBootTest中添加一个bean

转载 作者:搜寻专家 更新时间:2023-11-01 02:56:38 24 4
gpt4 key购买 nike

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

我的问题是关于在 SpringBootTest 中添加/声明一个 bean,而不是覆盖一个 bean,也不是使用 mockito 模拟一个 bean。

这是我在尝试最简单的实现我的实际需求时得到的结果(但它不起作用):

一些服务、bean 和配置:

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

@Value // lombok
public class MyClass {
private MyService monitoring;
}

@Configuration
public class SomeSpringConfig {

@Bean
public MyClass makeMyClass(MyService monitoring){
return new MyClass(monitoring);
}
}

测试:

@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?

编辑:

  • 我想ThreeDots's answer (创建配置测试类)是一般建议。
  • 但是,Danylo's answer (使用@ContextConfiguration)更符合我的要求,即直接在测试类中添加@Bean。

最佳答案

Spring Test 需要知道您正在使用什么配置(因此需要知道在哪里扫描它加载的 bean)。为了实现你想要的,你有更多的选择,最基本的是这两个:

  1. 在包含您的 bean 的测试类之外创建配置类

    @Configuration
    public class TestConfig {

    @Bean
    public MyService monitoringService() {
    return new MyService();
    }
    }

然后将其添加到测试作为配置类 @SpringBootTest(classes = { SomeSpringConfig.class, TestConfig.class })

  1. 如果你只需要在这个特定的测试中使用这个配置,你可以在静态内部类中定义它

    public class SomeSpringConfigTest {

    @Configuration
    static class ContextConfiguration {

    @Bean
    public MyService monitoringService() {
    return new MyService();
    }
    }
    }

这个会被spring boot测试自动识别加载

关于java - 如何在SpringBootTest中添加一个bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57772342/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com