1

我有一个这样的单元测试,使用

org.junit.contrib.java.lang.system.ExpectedSystemExit

org.junit.rules.TemporaryFolder

@Rule
public TemporaryFolder folder = new TemporaryFolder();

@Rule
public final ExpectedSystemExit exit = ExpectedSystemExit.none();


@Test
public void createsFile_integrationTest() throws Exception{

    final File tempFolder = folder.newFolder("temp");

    exit.expectSystemExitWithStatus(0);
    exit.checkAssertionAfterwards(new Assertion() {

        @Override
        public void checkAssertion() throws Exception {
            assertTrue(new File(tempFolder.getAbsolutePath() + "/created-file.txt").exists());

        }

     main.run(tempFolder.getAbsolutePath() +"/created-file.txt"); 

    });

问题在于,临时文件夹在系统退出后立即开始拆除,而不是在checkAssertion()调用 my 之后。

有没有办法可以防止我的临时文件夹被拆除,直到 checkAssertion 结束?

编辑:我认为答案是 - 进行重构并将它们分成两个测试 - 一个测试系统退出,另一个测试文件创建。

4

1 回答 1

1

您必须对规则强制执行命令,以便规则可以在关闭ExpectedSystemExit之前检查断言。TemporaryFolder您可以为此使用 JUnit 的RuleChain

private final TemporaryFolder folder = new TemporaryFolder();
private final ExpectedSystemExit exit = ExpectedSystemExit.none();

@Rule
public TestRule chain = RuleChain.outerRule(folder).around(exit);

@Test
public void createsFile_integrationTest() throws Exception {

    final File tempFolder = folder.newFolder("temp");

    exit.expectSystemExitWithStatus(0);
    exit.checkAssertionAfterwards(new Assertion() {

        @Override
        public void checkAssertion() throws Exception {
            assertTrue(new File(tempFolder.getAbsolutePath() + "/created-file.txt").exists());

        }
    });

    main.run(tempFolder.getAbsolutePath() +"/created-file.txt"); 

}
于 2017-01-26T00:13:10.967 回答