Как загрузить свойства из application.properties в тесте Mockito - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь написать модульный тест для проверки метода, но я столкнулся с проблемой.

вот пример кода:

MyService1

@Service
public class MyService1 {

    @Autowired
    private ServiceProperties serviceProperties;

    public void getMyLanguage(){
        String language =  serviceProperties.getLocale().getLanguage();
        printSomething(language);
    }

    private void printSomething(String input){
        System.out.print("your current language is " + input);
    }
}

ServiceProperties

import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.Locale;

@ConfigurationProperties(prefix = "conversation")
public class ServiceProperties {

    private ServiceProperties(){};

    private Locale locale;

    public Locale getLocale(){

        return locale;

    }
}

application.properties

conversation.locale=en_US

Вот мой тестовый пример:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

@RunWith(MockitoJUnitRunner.class)
public class MyService1Test {
    @Mock
    private ServiceProperties serviceProperties;

    @InjectMocks
    private MyService1 myService1;

    @Test
    public void getMyLanguage(){
        when(serviceProperties.getLocale().getLanguage()).thenReturn("EN");
        myService1.getMyLanguage();
        verify(myService1).getMyLanguage();
    }
}

тест вызовет nullpointerexception, потому что свойства для локали не загружаются в тесте, если я не хочу запускать сервер (используйте аннотацию @SpringBootTest) для загрузки контекста, есть ли способ решитьэта проблема, кто-нибудь может помочь?

Ответы [ 2 ]

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

Проблема в этой строке:

when(serviceProperties.getLocale().getLanguage()).thenReturn("EN");

Поскольку serviceProperties является поддельным, serviceProperties.getLocale() равно null.Таким образом, вы получаете NullPointerException, когда вызывается serviceProperties.getLocale().getLanguage().

Один обходной путь будет следующим:

@RunWith(MockitoJUnitRunner.class)
public class MyService1Test {
    @Mock
    private ServiceProperties serviceProperties;
    @InjectMocks
    private MyService1 myService1;

    @Test
    public void getMyLanguage(){
        when(serviceProperties.getLocale()).thenReturn(new Locale("EN"));
        myService1.getMyLanguage();
        verify(myService1).getMyLanguage();
    }
}

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

Инжекция поля не удобна для тестирования.Вы можете использовать конструктор инжекции

@Service
public class MyService {


    private final ServiceProperties serviceProperties;

    @Autowired
    public MyService(ServiceProperties serviceProperties) {
        this.serviceProperties = serviceProperties;
    }
    //...
}

И тогда вы сможете вводить макеты перед каждым тестом

@RunWith(MockitoJUnitRunner.class)
public class MyService1Test {
    @Mock
    private ServiceProperties serviceProperties;

    private MyService1 myService1;

    @Before
    public void createService(){
        myService1 = new MyService1(serviceProperties);
    }
}
...