运行 仅在 java 应用程序中使用 @MyTest 进行测试

Running only the tests with @MyTest inside java application

我有一个 TestRunner class:

public class TestRunner {

    private String result = "";

    public void runTests(List<String> testClassNames) {
        for (String testClassName : testClassNames) {

        }
    }

    public String getResult() {
        return result;
    }
}

然后我有两个测试 classes 并且我应该 运行 只有来自两个 classes 的 @MyTest 测试。 getResult() 应该本质上 return“exampleTest() - OK”或“exampleTest() - FAILED”,具体取决于测试是否通过。测试 class 看起来像这样:

public class ExampleTests1 {

    @MyTest (expected = IllegalStateException.class)
    public void test1() {
        throw new IllegalStateException();
    }

    @MyTest (expected = IllegalStateException.class)
    public void test2() {
        throw new RuntimeException();
    }
}

我尝试使用 JUnitCore 和 Result 来实现,但找不到将测试方法名称添加到结果中的方法。还有别的办法吗?

在这种情况下你必须使用反射。 这就是 JUnit 内部的工作方式:

因为这听起来像是 homework/assigment 用于教育目的(如果您正在开发“真正的”应用程序 - 那么只需使用 JUnit 或 TestNG,不要自己编写类似的东西 :)),我不会提供完整的解决方案,但这是您应该做的:

  1. 对于每个由 class 名称标识的 class,您应该得到一个描述此 class 名称的 java.lang.Class。您可以使用 Class.forName(...)
  2. 那么你应该得到 class 的所有方法(通过反射),每个方法 运行 如下:

2.1 检查方法是否有注解@MyTest。如果没有 - 不要处理它

2.2 同时检查方法名是否以test开头(String有startsWith方法)

2.3 如果发现测试class包含测试方法,那么:

2.3.1 创建一个Test实例Class(可能你可以假设它有no-ops构造函数,然后使用newInstance()

2.3.2 运行 方法(再次通过反思)。检查结果/用 try/catch 块包围执行调用以拦截错误。

2.3.3 打印作业中指定的结果:)