Java 如何从Mockito测试中的application.properties加载属性

Java 如何从Mockito测试中的application.properties加载属性,java,unit-testing,spring-boot,mocking,mockito,Java,Unit Testing,Spring Boot,Mocking,Mockito,我试图编写一个单元测试用例来测试该方法,但遇到了一个问题 以下是示例代码: MyService1 @Service public class MyService1 { @Autowired private ServiceProperties serviceProperties; public void getMyLanguage(){ String language = serviceProperties.getLocale().getLanguag

我试图编写一个单元测试用例来测试该方法,但遇到了一个问题

以下是示例代码:

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);
    }
}
服务属性

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;

    }
}
conversation.locale=en_US
应用程序属性

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;

    }
}
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,因为测试中没有加载locale的属性,如果我不想启动服务器(使用@SpringBootTest注释)来加载上下文,有什么方法可以解决这个问题,有人能帮忙吗

现场注入不便于测试。您可以使用构造函数注入

@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);
    }
}

问题出在这一行:

when(serviceProperties.getLocale().getLanguage()).thenReturn("EN");
因为
serviceProperties
是模拟的,
serviceProperties.getLocale()
等于
null
。因此,当调用
serviceProperties.getLocale().getLanguage()
时,您会得到
NullPointerException

一种解决办法如下:

@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();
    }
}