模拟对象并将它们分配给方法中的实例和静态变量

时间:2017-09-01 09:08:12

标签: java unit-testing junit

我有一个这样的课程:

// 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和对象模拟的初学者,并且可以使用任何解决问题的模拟框架。感谢。

2 个答案:

答案 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
    }
}