繁体   English   中英

如何在单元测试中设置 Spring 注入的值?

[英]How to set a value injected by Spring in a unit test?

我正在为 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的最简单方法是urlPath ,理想情况下(我假设)不更改代码,也不使用 Spring 上下文进行测试?

要对 Spring 组件进行单元测试,您需要使其成员可从外部设置。 最简单的方法是使用构造函数注入。 字段注入要求您运行@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();
            }
        }
    }
}

https://github.com/exabrial/mockito-object-injection

我们创建了一个 JUnit 扩展来解决这个确切的问题。

它很容易使用……请参阅 README.md:

@TestInstance(Lifecycle.PER_CLASS)
@ExtendWith({ MockitoExtension.class, InjectMapExtension.class })
public class MyControllerTest {

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM