首页 > 解决方案 > 如何在单元测试中设置 Spring 注入的值?

问题描述

我正在为 Spring 管理的以下类编写单元测试:

@Component
public class MyClass {
    @Value("${urlValue}")
    private String urlPath;
    private MyUrl url = new MyUrl(urlPath);

    public class MyUrl {
        MyUrl(String url) {
            if (url == null) {
                throw new NullPointerException();
            }
        }
    }
}

我正在尝试以urlValue最简单的方式进行测试。我尝试了以下方法:

public class MyClassTest {
    private MyClass mc;

    @Before
    public void setUp() {
        mc = new MyClass();
        ReflectionTestUtils.setField(mc, "urlPath", "urlValue");
    }

    @Test
    public void test() {

    }
}

然而,反射设置失败,因为它来得太晚(new MyUrl()之前调用并抛出异常)。什么是最简单的设置方法urlPath,理想情况下(我假设)不更改代码,也不使用 Spring 上下文进行测试?

标签: javaspringunit-testingjunit

解决方案


要对 Spring 组件进行单元测试,您需要使其成员可从外部设置。最简单的方法是使用构造函数注入。字段注入需要您运行 a @SpringBootTest,这会使您的单元测试速度慢得不合理,因为它会创建一个 Spring 上下文。

看看这里:spring boot 中的单元测试指南

你可以这样做(没有检查正确性):

@Component
public class MyClass {
    private String urlPath;
    private MyUrl url;

    public MyClass(@Value("${urlValue}") String urlPath) {
        this.urlPath = urlPath;
        this.url = new MyUrl(urlPath)
    }

    public class MyUrl {
        MyUrl(String url) {
            if (url == null) {
                throw new NullPointerException();
            }
        }
    }
}

推荐阅读