java - 如何在 Mockito 测试中从 application.properties 加载属性

标签 java unit-testing spring-boot mocking mockito

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

这里是示例代码:

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/

相关文章:

java - 避免 if else 语句

JavaFX TitledPane 内容在折叠后消失

python - python中的模板方法调用顺序

iphone - 在xCode中引用来自不同目标的类以进行iPhone单元测试

java - 从单个队列同时处理两个或多个相同的 JMS 消息

java - 如何解决无法加载身份验证插件 'caching_sha2_password'问题

java - 使用正弦和余弦绘制一个有角度的正方形

javascript - 应该调用 ngOnInit 内部的函数

java - 在 Spring Boot 中使用 @TestPropertySource 覆盖 @PropertySource

java kafka 通过唯一键获取分区中的消息偏移量