使用 ANTLR 4 测试预期的错误消息

Testng Expected error messages with ANTLR 4

我正在尝试使用 dataProvider,它为解析器和预期错误消息提供语法。

@Test(expectedExceptions = org.antlr.v4.runtime.misc.ParseCancellationException.class, expectedExceptionsMessageRegExp = ".*line .*", dataProvider = "antlrInput")
public void TestParsing(String input, String empty) throws ParseCancellationException {
    ProgramLexer lexer = new ProgramLexer(new ANTLRInputStream(input));
    lexer.removeErrorListeners();
    lexer.addErrorListener(DescriptiveErrorListener.INSTANCE);
    CommonTokenStream tokens = new CommonTokenStream(lexer);
    ProgramParser parser = new ProgramParser(tokens);
    parser.removeErrorListeners();
    parser.addErrorListener(DescriptiveErrorListener.INSTANCE);
    ParseTree tree = parser.program();
}

@DataProvider
public Object[][] antlrInput() {
    return new Object[][] {
            {"int x", "line 1:5 missing ';' at '<EOF>'"},
            {"int x, d", "line 1:5 mismatched input ',' expecting ';'"},
    };
}

上面说 expectedExceptionsMessageRegExp = ".* line .* 我希望能够使用 dataProvider 数组的第二部分。

正如在 dataProvider 中看到的那样,抛出的消息会根据我用作输入的语法类型而有所不同,这就是我想要测试的内容。

您需要使用 TestNG 中的一种 Assert 方法来做到这一点。您不能动态更改 Annotation 的属性值,除非您想使用反射来做到这一点。但在我看来,这会过度扼杀一个简单的需求,而这个需求可以通过使用断言来实现。
EDIT1:Assert.assertThrowsAssert.expectThrows 或者简单地在 try { } catch(ParseCancellationException p) {} 块中添加该代码块,然后在 catch 块中捕获异常消息并使用 Assert.assertEquals(actualErrorMessage,expectedErrorMessage)

断言