使用ANTLR 4

时间:2016-05-11 09:36:07

标签: java testing testng antlr grammar

我正在尝试使用dataProvider,它为解析器和expectederrormessage提供语法。

@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中可以看到的那样,抛出的消息将根据我用作输入的语法类型而有所不同,这就是我想要测试的内容。

1 个答案:

答案 0 :(得分:2)

您需要使用TestNG中的Assert方法之一来实现这一点。您无法动态更改Annotation中的属性值,除非您想使用反射来执行此操作..但是我的观点是过度杀死一个简单的要求,只需使用断言即可实现。
EDIT1:Assert.assertThrowsAssert.expectThrows或简单地在try { } catch(ParseCancellationException p) {}块中添加该代码块,然后在catch块捕获异常消息中并使用Assert.assertEquals(actualErrorMessage,expectedErrorMessage)

断言