Springboot单元测试动态设置@Configuration属性

时间:2018-11-06 20:17:07

标签: java unit-testing spring-boot

我有一个在命令行上运行的springboot 2应用程序。命令行参数之一是在命名中带有batchNo的fileName。我使用命令行arg中的fileName设置了application.properties fileName值。示例batch-1234.csv

在我的ApplicationConfig文件中,我正在像这样从applications.properties文件读取文件名。

@ToString
@Setter
@Getter
@Configuration
@ConfigurationProperties(prefix = "hri")
public class ApplicationConfig {

    @Value("${company.file}")
    private String file;

    public String getBatchNo() {
        return parseBatchNo(file);
    }

    public String getHomecareDetailPath() {
        return filePathProvider.getFilePath("batch-" + getBatchNo() + ".csv");
    }

    private static String parseBatchNo(String file) {
        if (batchNo == null) {
            batchNo = file.substring((file.lastIndexOf("-") + 1), (file.length() - 4));
        }
        return batchNo;
    }
}

我的目标是能够为每个单独的测试动态设置此文件名。

示例

@RunWith(SpringRunner.class)
@SpringBootTest(classes = AdapLoadApplication.class)
@AutoConfigureTestDatabase
public class CorporateServiceTest {

    @Autowired
    private ApplicationConfig config; 

    @Test
    public void convertCsvToBean() throws IOException {
        //Set file
        config.setFile("batch-9999.csv);
    }

    @Test
    //Is there an annotation to set the Application.properties file for each test?
    public void test2() throws IOException {
        //Set file
        config.setFile("batch-8888.csv);
    }
}

如何动态设置文件,以便更好地管理测试?当前,我们正在使用同一文件,并且必须进行大量文件复制以覆盖测试文件。

我想澄清一下,我不是想在我的Test类中创建一个新的ApplicationConfig bean,并设置文件并从每个测试中读取相同的文件。我想在每个测试的开头设置该文件名。

1 个答案:

答案 0 :(得分:0)

例如,您可以使用环境:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = AdapLoadApplication.class)
@AutoConfigureTestDatabase
public class CorporateServiceTest {

    @Autowired
    private ApplicationConfig config;

    @Resource
    private Environment env;

    @Test
    public void convertCsvToBean() throws IOException {
        //Set file
        config.setFile(env.getProperty("first_test_company.file"));
    }

    @Test
    //Is there an annotation to set the Application.properties file for each test?
    public void test2() throws IOException {
        //Set file
        config.setFile(env.getProperty("second_test_company.file"));
    }
}

您必须使用@Resource,因为@Autowired在这种情况下不起作用。