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

标签 java spring junit mockito

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

相关文章:

java - 将 google play services 版本添加到应用程序的 list 中会出错

java - 具有附加参数的 JPA 关系 ManyToMany

java - 查询关于spring中的application context和beanfactory

java - Spring Boot Junit测试通过构造函数注入(inject)注入(inject)dao接口(interface)

java - 如何使用 Mockito 和 jUnit 模拟持久化和实体

java - 从命令行编译 JUnit 时出错

java - 如何为我自己的应用程序设置进程名称

java - 如何从 Javascript 使用 java.util.Observable?

java - 如何优化最常出现的值(数亿行)的检索

spring - 我可以在 tomcat 上使用一个 hibernate 持久性单元并在部署的 war 之间共享它吗?