我有一个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。怎么可能呢?我做错什么了吗?
2条答案
按热度按时间wecizke31#
你在嘲笑我
EnvUtils
类,所以方法isDev
也将不会调用类的实际方法。在你的情况下,你不需要
@MockBean
,将其删除。别忘了初始化envUrils
对象使用默认构造函数。irtuqstp2#
你嘲笑了整个envutils班。如果你把它改成间谍,那就是工作了。阅读this:mock vs 间谍
试试这个: