单元测试在文件存在时具有不同的行为

时间:2017-10-08 16:13:40

标签: java unit-testing tdd testng

在某些情况下,软件应根据某些环境条件采取不同的行为,例如某个地方是否存在文件。

在我的情况下,我正在开发一个库,它是根据类路径中的配置文件配置的(如果配置文件不存在,则会回退到默认行为)。

我该如何对这门课进行单元测试? 在以下情况下,我需要编写用于评估类的测试:

  • 类路径中不存在该文件
  • 包含内容A的文件存在于类路径
  • 包含内容B的文件存在于类路径

但我不知道如何配置环境来证明所有这些。并且一个接一个地执行测试。

顺便说一下,我使用Java,并且我在测试类路径上同时拥有JUnit和TestNG。

编辑: 其中一个问题是配置文件驻留在类路径中,因此如果普通的ClassLoader 找到并加载它,只要使用相同的类加载器,它就会返回相同的内容。 我相信使用自定义ClassLoader进行测试非常复杂,需要测试来验证测试!

1 个答案:

答案 0 :(得分:1)

您可以使用测试创建的临时文件来模拟班级中的路径。

ConfigurationTest.java:

import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import static org.junit.Assume.assumeThat;

import java.nio.file.Files;
import org.junit.Test;

public class ConfigurationTest {

    private Configuration config = new Configuration();

    @Test
    public void testWithConfigFile() throws Exception {
        config.configFile = Files.createTempFile("config_",".ini");
        config.configFile.toFile().deleteOnExit();
        assertFalse(config.isInDefaultMode());
    }
    @Test
    public void testWithoutConfigFile() throws Exception {
        assumeThat(Files.exists(config.configFile), is(false));
        assertTrue(config.isInDefaultMode());
    }
}

Configuration.java:

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Configuration {

    Path configFile = Paths.get("config.ini");

    public boolean isInDefaultMode() {
        return !Files.exists(configFile);
    }
}