使用Mockito测试Spring环境配置文件



最新版本的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);

相关内容

  • 没有找到相关文章

最新更新