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