Тестирование профилей среды Spring с Mockito - PullRequest
0 голосов
/ 16 ноября 2018

В последней версии 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));
        }
    }
}

Старая версия, использующая аргумент String для acceptptsProfiles, была легко поддельной.Что я делаю неправильно?Такое ощущение, что класс Profiles может принести пользу методу equals ()?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Это не весна, это просто неправильный подход.Как я вижу, проблема в этой части кода: when(environment.acceptsProfiles(Profiles.of("adrian"))).thenReturn(true);

Вы используете mock для 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"));
    }
0 голосов
/ 12 февраля 2019

Вы можете создать простое сопоставление на основе 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...