1

有没有我可以在 JUnit 中实现的类/方法,它基本上是一个“钩子”,在每个测试用例完成后运行,用户定义的(在代码中)元数据可用?

我正在尝试完成这样的事情:

  • 使用用户定义的注释来注释测试用例,例如团队所有权(例如@Team(Teams.PAYMENTS)
  • 使用 3 个值将测试结果打印到控制台:测试名称(测试函数名称)、状态(通过/失败)和团队(注释值)

为简单起见,我只需要打印此信息(稍后它将在其他地方发布),但我真的迷失在哪里可以在测试运行后在一个地方获取此测试元数据信息?

我试图在我们的一个TestRunner类中覆盖完成方法:

    override fun finish(resultCode: Int, results: Bundle?) {
        System.out.println("===breakpoint here===")

        super.finish(resultCode, results)
    }

但是在调试时,这里没有测试元数据。关于如何解决这个问题的任何建议?

谢谢!

4

1 回答 1

2

对于 JUnit 4,您可以使用TestWatcher规则:

import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;

public class TestWatcherAPIUnitTest {

    @Rule(order = Integer.MIN_VALUE)
    public TestWatcher watchman = new TestWatcher() {
        @Override
        protected void failed(Throwable e, Description description) {
            System.out.println(description + " Team: " + getTeam(description) + " failed!");
        }

        @Override
        protected void succeeded(Description description) {
            System.out.println(description + " Team: " + getTeam(description) + " success!");
        }

        String getTeam(Description description) {
            Team team = description.getAnnotation(Team.class);
            return (team != null) ? team.value() : "unknown_team";
        }


    };

    @Test
    @Team("team1")
    public void failing_test() {
        Assert.assertTrue(false);
    }

    @Test
    @Team("team2")
    public void successful_test() {
        Assert.assertTrue(true);
    }
}

同样,对于 JUnit5,有一个TestWatcher API

于 2021-04-21T11:15:21.867 回答