【问题标题】:How to add property file in Mock method - Mockito如何在 Mock 方法中添加属性文件 - Mockito
【发布时间】:2021-06-10 19:15:00
【问题描述】:

我正在尝试为 Java Spring Boot 1.2.5 中的应用程序编写 JUnit 测试用例。 我有一个服务类,我正在使用 Mockito 编写 JUnit 测试用例。

服务类

class ManualWorkFlowService implements ManualWorkFlowInterface {
              @Autowired
              private Environment environment;

              public void fetchFlowData(Long flowId) {
                            String config = environment.getProperty("manual.workflow.config");
                             // Big method body to follow.
              }
}

JUnit 类

@RunWith(MockitoJUnitRunner.class)
public class LMVendorServiceTest extends BaseTest {

              @InjectMocks
              private ManualWorkFlowInterface service = new ManualWorkFlowService();
 
              @Test
              public void fetchFlowDataTest() throws Exception {
                             service.fetchFlowData("1234");
              }            
}

Junit方法调用了fetchFlowData()方法,但是原方法中的environment.getProperty("manual.workflow.config")抛出空指针异常(因为环境属性为null)

我已经修复了类似下面的问题

@RunWith(MockitoJUnitRunner.class)
public class LMVendorServiceTest extends BaseTest {

              @InjectMocks
              private ManualWorkFlowInterface service = new ManualWorkFlowService();

              @Mock
              private Environment mockenvironment;
 
              @Test
              public void fetchFlowDataTest() throws Exception {
              when(mockenvironment.getProperty("manual.workflow.config")).thenReturn("something");
                             service.fetchFlowData("1234");
              }            
}

我的疑问是,

  1. 我可以配置与原来相同的属性文件吗 应用程序在我的测试类中使用?如果是怎么办?
  2. 是否有可能,当我从 Junit 调用原始方法 (fetchFlowData(Long flowId)) 时,它会自动获取原始应用程序中配置的应用程序属性文件,以便 environment.getProperty("manual.workflow.config") 工作正常没有在测试类中单独配置属性文件?

我尝试了以下方法,但 @Value 没有获取属性文件值

@RunWith(MockitoJUnitRunner.class)
@PropertySource("file:C:\\properties\\application.properties")
public class LMVendorServiceTest extends BaseTest {
    @InjectMocks
    private ManualWorkFlowInterface service = new ManualWorkFlowService();

    @Mock
    private Environment mockenvironment;
            
    @Value("${manual.workflow.config}")
    private String property;      //Null here
            
    @Test
    public void fetchFlowDataTest() throws Exception {
        when(mockenvironment.getProperty("manual.workflow.config")).thenReturn(property);
         service.fetchFlowData("1234");
    }            
}

【问题讨论】:

    标签: java spring-boot junit mockito


    【解决方案1】:

    变化:

    @Autowired
    private Environment environment;
    

    收件人:

    private Environment environment;
    
    @Autowired
    void setEnvironment(Environment env) {
        // Doesn't need to be public if your service and test are in the same package
        this.environment = env;
    }
    

    并在您的测试中使用 Spring 的 MockEnvironment,为您想要的任何属性文件添加 PropertySource

    MockEnvironment env = new MockEnvironment();
    
    Resource resource = new ClassPathResource("/my.properties");
    Properties props = PropertiesLoaderUtils.loadProperties(resource);
    env.getPropertySources().addLast(new PropertiesPropertySource("testProperties", props));
    
    ManualWorkFlowInterface service = new ManualWorkFlowService();
    service.setEnvironment(env);
    

    【讨论】:

    • 更好,使用@Value("${myProperty}") 并使其成为构造函数参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    相关资源
    最近更新 更多