![](/img/trans.png)
[英]ReflectionTestUtils.setField (Mockito), not recognizing field.
[英]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.env
是dev
,正如预期的那样,但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.