通过类和方法名称发现 JUnit5 参数化测试会抛出 org.junit.platform.commons.PreconditionViolationException

问题描述 投票:0回答:2

我运行了一组测试来测试我公司网站上各种工具的 UI。我构建了一个在不同环境中运行这些测试的系统,出于我的关注,我编写了允许我在这些多个环境中运行单个测试的代码。问题是,当我尝试通过 MethodSelector 运行参数化测试(将类和方法名称作为字符串传递)时,出现以下错误:

Caused by: org.junit.platform.commons.PreconditionViolationException: Could not find method with name [TestTheThing] in class [tests.tool.fragments.TestClass].

然后我尝试传递包含参数的方法名称,但随后出现此错误:

Failed to load parameter type [String param] for method [TestTheThing] in class [tests.tool.fragments.TestClass].

我已经研究这个有一段时间了,但还没有取得任何成果,希望得到一些帮助。这是测试的模型:

public class TestClass {

    @ParameterizedTest
    @MethodSource("getParams")
    public void TestTheThing(String param) {
        // test code here
    }
}

这是我用来查找和运行测试的实际代码(getAllTestSelectors 中的所有选择器都是 ClassSelector 类型):

    // Runs a single tests in a fragment of a tool (used for batch-testing only)
    public void runSingleTestInFragment(String fragment, String test) {
        
        if (fragment.equals(""))
            throw new MasterTestException("Fragment name is empty");
        
        if (test.equals(""))
            throw new MasterTestException("Test name is empty");
        
        // Make sure test fragment exists
        String className = null;
        
        for (DiscoverySelector s : getAllTestSelectors()) {
            ClassSelector classSelector = (ClassSelector) s;
            String cname = classSelector.getClassName();
            String name = cname.substring(cname.lastIndexOf(".") + 1);
            
            if (name.contains(fragment)) {
                className = classSelector.getClassName();
                break;
            }
        }
        
        if (className == null)
            throw new MasterTestException("Could not find a test fragment named '" + fragment + "' for the tool " + data.getAsEnum("tool"));
        
        // Create the selector
        MethodSelector selector = DiscoverySelectors.selectMethod(className + "#" + test);
        
        // Test that the selector is valid (will throw a PreconditionViolationException if otherwise)
        try {
            selector.getJavaMethod();
            
        } catch (PreconditionViolationException e) {
            throw new MasterTestException("The test method '" + test + "' does not exist in the fragment '" + fragment + "'", e);
        }
        
        runTests(selector);
    }
java junit5
2个回答
0
投票

类型名称不是

String param

相反,它必须是完全限定的类型名称。对于字符串,即

java.lang.String

通过其完全限定方法名称选择参数化方法时,如果您的类位于

example
包中,则为
example.TestClass#TestTheThing(java.lang.String)

这在 Javadoc 中有完整记录。


0
投票

尝试从 getParams 方法返回字符串值流。 请检查下面的 getParams 虚拟方法并相应地在您的代码中进行尝试。

private static Stream<String> getParams() {
   return Stream.of("value1", "value2");
}

对于上述测试方法将对输入“value1”和“value2”运行两次。您可以在流中返回任意数量的字符串(1 个或更多)。

© www.soinside.com 2019 - 2024. All rights reserved.