不推荐使用最新版本的Spring Framework Environment.acceptsProfiles(String ...)赞成Environment.acceptsProfiles(Profiles ...)
在我的一个应用程序中更新它使测试变得更加困难,下面是一些测试代码来演示该问题:
测试 测试
测试二测试
使用String参数接受acceptsProfiles的旧版本很容易模拟。我究竟做错了什么?感觉Profiles类可能会受益于equals()方法?
答案 0 :(得分:0)
您可以基于 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);
答案 1 :(得分:0)
这不是Spring,这只是错误的方法。如我所见,问题出在这部分代码中:
when(environment.acceptsProfiles(Profiles.of("adrian"))).thenReturn(true);
您对Environment
使用了模拟,并尝试捕获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"));
}
或不要使用模拟(我想这就是您要寻找的):
@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"));
}