【问题标题】:Spring bean methods don't use the field value injected by ReflectionTestUtils.setFieldSpring bean 方法不使用 ReflectionTestUtils.setField 注入的字段值
【发布时间】:2021-05-12 22:13:19
【问题描述】:

我有一个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());
    }

}

测试应该通过,因为env 的值是dev,这意味着envUtils.isDev() 肯定会返回true。然而,这个测试失败了。我调试了一下,发现envUtils.envdev,不出所料,但是envUtils.isDev()返回false。怎么会这样?我是不是做错了什么?

【问题讨论】:

  • 这个测试是怎么失败的?你的实际测试是什么?没有必要测试ReflectionUtils.setField()。你也有MockitoExtension,但你正在使用@MockBean?这甚至应该是@SpringBootTest吗?

标签: java spring testing junit


【解决方案1】:

你在模拟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());
    }

}

【讨论】:

    【解决方案2】:

    你嘲笑了整个 EnvUtils 类。 如果你把它改成 Spy 就可以了。 阅读:mock vs spy

    试试这个:

    @ExtendWith(MockitoExtension.class)
    class MainControllerTests {
    
        @SpyBean
        private EnvUtils envUtils;
    
        @Test
        void fieldTest() {
            ReflectionTestUtils.setField(envUtils, "env", "dev");
            Assertions.assertTrue(envUtils.isDev());
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2011-04-20
      • 2021-11-26
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      相关资源
      最近更新 更多