【问题标题】:How to mock constructor injected @Value property in Spring Boot Unit Testing如何在 Spring Boot 单元测试中模拟构造函数注入的 @Value 属性
【发布时间】:2021-07-16 05:37:01
【问题描述】:

我有如下服务,其中包含服务的构造函数依赖注入和配置属性。

@Service
public class MyService {

    private OtherService service;

    private final SomeClass c;

    @Autowired
    public MyService(
        OtherService service,
        @Value("${app.some-property}") String someProperty) {

        this.service = service;
        final String key = service.getKey();
        SomeClient client = new SomeClient(key, someProperty);
        c = new SomeClass(client);
    }
}

我们应该如何使用 Mockito 在单元测试用例中注入/模拟属性 ${app.some-property} 的值?

【问题讨论】:

  • 你没有。使用您想要的值调用构造函数,或使用@ConfigurationProperties

标签: spring-boot unit-testing mockito


【解决方案1】:

还可以使用 spring 提供的“ReflectionTestUtils”来设置模拟中的值:

ReflectionTestUtils.setField(target, "name", value);

在这种情况下,目标将是单元测试中的模拟类,例如由@Mock 注释,上面的静态调用可以在所有测试之前或每次测试之前执行的函数中完成。

Spring ReflectionUtils

【讨论】:

    【解决方案2】:

    你可以,但你不应该,因为@Value 是一个弹簧注解,并且要获得分配给它的值,你应该使用 Spring 提供的测试机制。

    不要使用@RunsWith(MockitoRunner.class),而是使用@ExtendsWith(SpringExtension.class)

    并在您的src/test/resources 目录中创建一个包含所需属性的测试属性文件,然后您的测试可以自动分配该属性值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-23
      • 2017-05-01
      • 2021-05-28
      • 2021-09-29
      • 1970-01-01
      • 2020-02-07
      • 2019-07-04
      • 2019-10-19
      相关资源
      最近更新 更多