最新版本的Spring Framework已被弃用Environment.acceptsProfiles(String…(支持Environment.AcceptsPprofiles(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));
}
}
}
使用String参数接受Profiles的旧版本很容易模拟。我做错了什么?感觉Profiles类可能会受益于equals((方法?
这不是Spring,只是不正确的方法。正如我所看到的,问题出现在代码的这一部分:when(environment.acceptsProfiles(Profiles.of("adrian"))).thenReturn(true);
您对Environment
使用mock,并尝试捕获Profiles
类的实例,类似于:.acceptsProfiles(eq(Profiles.of("adrian")))
。您无法捕获它,因为您在方法boolean hello(String s)
中创建了另一个实例,而Environment
永远不会返回true。
您刚刚描述了模拟Environment
的错误行为,您可以修复它:
放入any
@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"));
}
或者不要使用mock(我想这就是你想要的(:
@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"));
}
您可以基于toString创建一个简单的匹配器。
public static Profiles profiles(String... profiles) {
return argThat(argument -> {
String expected = Objects.toString(Profiles.of(profiles));
String actual = Objects.toString(argument);
return expected.equals(actual);
});
}
然后按如下方式使用匹配器:
when(environment.acceptsProfiles(profiles("myProfile"))).thenReturn(true);