我正在尝试使用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中可以看到的那样,抛出的消息将根据我用作输入的语法类型而有所不同,这就是我想要测试的内容。
答案 0 :(得分:2)
您需要使用TestNG中的Assert
方法之一来实现这一点。您无法动态更改Annotation中的属性值,除非您想使用反射来执行此操作..但是我的观点是过度杀死一个简单的要求,只需使用断言即可实现。
EDIT1:Assert.assertThrows
或Assert.expectThrows
或简单地在try { } catch(ParseCancellationException p) {}
块中添加该代码块,然后在catch块捕获异常消息中并使用Assert.assertEquals(actualErrorMessage,expectedErrorMessage)