我正在尝试编写一个单元测试用例来测试该方法,但遇到了问题。
这里是示例代码:
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;
}
}
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,因为测试中没有加载locale的属性,如果我不想启动服务器(使用@SpringBootTest注解)来加载上下文,有什么办法可以解决这个问题,有人可以帮忙吗?
最佳答案
问题出在这一行:
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();
}
}
关于java - 如何在 Mockito 测试中从 application.properties 加载属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54796369/