最新版本的 Spring Framework 已弃用 Environment.acceptsProfiles(String ...)支持Environment.acceptsProfiles(Profiles ...)
在我的一个应用程序中更新这一点使测试变得更加困难,这里有一些测试代码来演示该问题:
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.junit.Test;
import org.springframework.core.env.Environment;
import org.springframework.core.env.Profiles;
import org.springframework.core.env.StandardEnvironment;
public class EnvironmentProfilesTest {
@Test
public void testItWithRealEnvironment() {
System.setProperty(StandardEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, "adrian");
Environment environment = new org.springframework.core.env.StandardEnvironment();
ToBeTested toBeTested = new ToBeTested(environment);
assertTrue(toBeTested.hello("adrian"));
}
@Test
public void testItWithMocklEnvironment() {
Environment environment = mock(Environment.class);
when(environment.acceptsProfiles(Profiles.of("adrian"))).thenReturn(true);
ToBeTested toBeTested = new ToBeTested(environment);
assertTrue(toBeTested.hello("adrian"));
}
private static class ToBeTested {
private Environment env;
public ToBeTested(Environment env) {
this.env = env;
}
public boolean hello(String s) {
return env.acceptsProfiles(Profiles.of(s));
}
}
}
旧版本使用字符串参数来接受配置文件很容易模拟。我究竟做错了什么?感觉 Profiles 类可能会受益于 equals() 方法?
最佳答案
这不是 Spring,这只是不正确的方法。正如我所看到的,问题出在这部分代码中:
when(environment.acceptsProfiles(Profiles.of("adrian"))).thenReturn(true);
您使用模拟Environment
并 try catch Profiles
类的实例,如下所示:
.acceptsProfiles(eq(Profiles.of("adrian")))
。您无法捕获它,因为您在方法 boolean hello(String s)
中创建了另一个实例,并且 Environment
永远不会返回 true。
您刚刚描述了模拟环境
的错误行为,您可以修复它:
放置任意
@Test
public void testItWithMocklEnvironment() {
Environment environment = mock(Environment.class);
when(environment.acceptsProfiles(any(Profiles.class))).thenReturn(true);
ToBeTested toBeTested = new ToBeTested(environment);
assertTrue(toBeTested.hello("adrian"));
}
或不要使用模拟(我认为这就是您正在寻找的):
@Test
public void testItWithMocklEnvironment() {
Environment environment = new org.springframework.core.env.StandardEnvironment();
((StandardEnvironment) environment).setActiveProfiles("adrian");
ToBeTested toBeTested = new ToBeTested(environment);
assertTrue(toBeTested.hello("adrian"));
}
关于java - 使用 Mockito 测试 Spring 环境配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53341533/