我有一个这样的课程:
// This class will process the incoming flat files from various data sources
public class FileProcessor {
private String fileName;//Say filetype_datasource_yyyyMMddHHmmss.dat
private String fileType;
private String fileNameWithoutExtension;
private String fileSource;
private String timestamp;
private boolean validFileName;
private static final Logger logger = Logger.getLogger(FileProcessor.class);
public FileProcessor(String fileName) {
this.fileName = fileName;
}
public void validateFileName() {
fileNameWithoutExtension = fileName.substring(0, fileName.indexOf("."));
String[] fileNameSplit = fileName.split("_");
fileType = fileNameSplit[0];
logger.info("File type: " + fileType);
fileSource = fileNameSplit[1];
logger.info("File source: " + fileSource);
timestamp = fileNameSplit[2];
logger.info("File timestamp: " + timestamp);
validFileName = validateFileType() && validateFileSource() && validateTimestamp();
}
private boolean validateFileType() {
boolean result;
//Validate as per business rules
...
return result;
}
private boolean validateFileSource() {
boolean result;
//Validate as per business rules
...
return result;
}
private boolean validateTimestamp() {
boolean result;
//Validate as per business rules
...
return result;
}
}
这里的问题是validateFileName()
使用了一些实例变量(fileNameWithoutExtension, fileType, fileSource, timestamp, validFileName
)和一个静态变量(logger
)。
编写JUnit测试用例的最佳方法是模拟分配给实例的对象和方法validateFileName()
中使用的静态变量吗?
我是Junit和对象模拟的初学者,并且可以使用任何解决问题的模拟框架。感谢。
答案 0 :(得分:1)
所有这些变量:
fileNameWithoutExtension, fileType, fileSource, timestamp,
validFileName
是派生数据
您可以从FileProcessor
构造函数的String fileName
参数的单个依赖项中获取它们。
但即使String fileName
也不应该嘲笑。它不是您想要隔离的依赖项。您希望它是一个真实/普通的对象,因为它构成了组件输入数据的一部分。
答案 1 :(得分:1)
您不需要模拟字段,因为它们都来自fileName
,它来自构造函数的参数。
所以使用JUnit 4 - 并假设您不需要检查记录的内容,您可以这样做:
import org.junit.Assert;
import org.junit.Test;
// ... other imports
public class FileProcessorTest {
@Test
public void test() {
// test a valid case
String file = "filetype_datasource_yyyyMMddHHmmss.dat";
FileProcessor processor = new FileProcessor(file);
Assert.assertTrue(processor.validateFileType());
// ... more assertions
// test where it should fail
file = "filetype_invalid_xxx.dat";
processor = new FileProcessor(file);
Assert.assertFalse(processor.validateFileType());
// ... more assertions
}
}