繁体   English   中英

Spring bean 方法不使用 ReflectionTestUtils.setField 注入的字段值

[英]Spring bean methods don't use the field value injected by ReflectionTestUtils.setField

我有一个 spring 项目,其中包含一个名为 EnvUtils 的EnvUtils

package com.example;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Objects;

@Component
public class EnvUtils {

    @Value("${env}")
    private String env;

    /**
     * Develop environment
     */
    public boolean isDev() {
        return Objects.equals(env, "dev");
    }

    /**
     * Production environment
     */
    public boolean isProd() {
        return Objects.equals(env, "prod");
    }

}

我写了一个简单的测试,将env的值设置为dev ,并检查了isDev()的结果:

package com.example;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.util.ReflectionTestUtils;

@SpringBootTest
@ExtendWith(MockitoExtension.class)
class MainControllerTests {

    @MockBean
    private EnvUtils envUtils;

    @Test
    void fieldTest() {
        ReflectionTestUtils.setField(envUtils, "env", "dev");
        Assertions.assertTrue(envUtils.isDev());
    }

}

测试应该通过,因为env的值为dev ,这意味着envUtils.isDev()肯定应该返回true 然而,这个测试失败了。 我对其进行了调试,发现envUtils.envdev ,正如预期的那样,但envUtils.isDev()返回 false。 怎么会这样? 我做错了什么吗?

你是mocking EnvUtils class,所以方法isDev也被mock了,class的真正方法不会被调用。

在您的情况下,您不需要@MockBean ,请将其删除。 并且不要忘记使用默认构造函数初始化envUrils object。

@SpringBootTest
@ExtendWith(MockitoExtension.class)
class MainControllerTests {

    private EnvUtils envUtils = new EnvUtils();

    @Test
    void fieldTest() {
        ReflectionTestUtils.setField(envUtils, "env", "dev");
        Assertions.assertTrue(envUtils.isDev());
    }

}

你嘲笑了整个 EnvUtils class。 如果你把它改成 Spy 就可以了。 阅读本文: 模拟与间谍

尝试这个:

@ExtendWith(MockitoExtension.class)
class MainControllerTests {

    @SpyBean
    private EnvUtils envUtils;

    @Test
    void fieldTest() {
        ReflectionTestUtils.setField(envUtils, "env", "dev");
        Assertions.assertTrue(envUtils.isDev());
    }

}

暂无
暂无

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

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