Springbean方法不使用reflectiontestutils.setfield注入的字段值

v64noz0r  于 2021-07-23  发布在  Java
关注(0)|答案(2)|浏览(366)

我有一个spring项目,它包含一个名为 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());
    }

}

测试应该通过,因为 envdev ,这意味着 envUtils.isDev() 一定会回来的 true . 然而,这个测试失败了。我调试了一下发现 envUtils.envdev ,如预期,但是 envUtils.isDev() 返回false。怎么可能呢?我做错什么了吗?

wecizke3

wecizke31#

你在嘲笑我 EnvUtils 类,所以方法 isDev 也将不会调用类的实际方法。
在你的情况下,你不需要 @MockBean ,将其删除。别忘了初始化 envUrils 对象使用默认构造函数。

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

    private EnvUtils envUtils = new EnvUtils();

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

}
irtuqstp

irtuqstp2#

你嘲笑了整个envutils班。如果你把它改成间谍,那就是工作了。阅读this:mock vs 间谍
试试这个:

@ExtendWith(MockitoExtension.class)
class MainControllerTests {

    @SpyBean
    private EnvUtils envUtils;

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

}

相关问题