【发布时间】: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.env是dev,不出所料,但是envUtils.isDev()返回false。怎么会这样?我是不是做错了什么?
【问题讨论】:
-
这个测试是怎么失败的?你的实际测试是什么?没有必要测试
ReflectionUtils.setField()。你也有MockitoExtension,但你正在使用@MockBean?这甚至应该是@SpringBootTest吗?