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

时间:2018-11-16 16:06:55

标签: java spring junit mockito

不推荐使用最新版本的Spring Framework Environment.acceptsProfiles(String ...)赞成Environment.acceptsProfiles(Profiles ...)

在我的一个应用程序中更新它使测试变得更加困难,下面是一些测试代码来演示该问题:

测试  测试
测试二测试

使用String参数接受acceptsProfiles的旧版本很容易模拟。我究竟做错了什么?感觉Profiles类可能会受益于equals()方法?

2 个答案:

答案 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"));
    }