Java 如何对依赖于其他方法的方法进行单元测试

Java 如何对依赖于其他方法的方法进行单元测试,java,junit5,Java,Junit5,我有以下方法 public static File getInventoryFileFromProperties(){ String filePath = getProperty(ConfigProperties.MY_INVENTORY_FILE); logger.debug("Looking for inventory file at {}", filePath); return new File(filePath); } 如何针对以下情况进行单元测试,Confi

我有以下方法

public static File getInventoryFileFromProperties(){
    String filePath = getProperty(ConfigProperties.MY_INVENTORY_FILE);
    logger.debug("Looking for inventory file at {}", filePath);

    return new File(filePath);
}
如何针对以下情况进行单元测试,ConfigProperties.MY_INVENTORY_文件不在属性文件中

getProperty() // gets values from property file
ConfigProperties.MY_INVENTORY_FILE // is an enum of keys 

使访问外部资源(如文件系统)的代码可进行单元测试的最佳方法是创建一个抽象层,例如:

然后,可以通过依赖项的构造函数注入重构被测试的类以使用资源访问器:

public class ContainingClass {

    private FileAccessor fileAccessor;

    // this constructor is accessible for the unit tests
    ContainingClass(FileAccessor fileAccessor) {
        this.fileAccessor = fileAccessor;
    }

    // this constructor is used by normal client code
    public ContainingClass() {
        this(new FileAccessor());
    }

    public File getInventoryFileFromProperties(){
        String filePath = fileAccessor.getProperty(ConfigProperties.MY_INVENTORY_FILE);
        return fileAccessor.createFile(filePath);
    }
}
最后,单元测试变得更简单,因为您可以模拟文件访问。此测试使用模拟框架模拟依赖项,并且也适用于JUnit的早期版本:

import static org.mockito.Mockito.*;
import org.junit.Test;

public class ContainingClassTest {

    @Test
    public void getInventoryFileFromProperties_MY_INVENTORY_FILE_isMissing() {

        FileAccessor fileAccessor = mock(FileAccessor.class);

        // arrange the config file to return a null value for the property
        when(fileAccessor.getProperty(ConfigProperties.MY_INVENTORY_FILE)).thenReturn(null);

        // act; call the method
        new ContainingClass(fileAccessor).getInventoryFileFromProperties();

        // assert that the file-creating method was called with a null path
        verify(fileAccessor).createFile(isNull(String.class));
    }
}

您是否可以修改
getInventoryFileFromProperties()
和包含的类以使其更容易进行单元测试,或者您是否正在寻找方法以测试代码的现状?
import static org.mockito.Mockito.*;
import org.junit.Test;

public class ContainingClassTest {

    @Test
    public void getInventoryFileFromProperties_MY_INVENTORY_FILE_isMissing() {

        FileAccessor fileAccessor = mock(FileAccessor.class);

        // arrange the config file to return a null value for the property
        when(fileAccessor.getProperty(ConfigProperties.MY_INVENTORY_FILE)).thenReturn(null);

        // act; call the method
        new ContainingClass(fileAccessor).getInventoryFileFromProperties();

        // assert that the file-creating method was called with a null path
        verify(fileAccessor).createFile(isNull(String.class));
    }
}