使用 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.assertThrows
或 Assert.expectThrows
或者简单地在 try { } catch(ParseCancellationException p) {}
块中添加该代码块,然后在 catch 块中捕获异常消息并使用 Assert.assertEquals(actualErrorMessage,expectedErrorMessage)
断言
我正在尝试使用 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.assertThrows
或 Assert.expectThrows
或者简单地在 try { } catch(ParseCancellationException p) {}
块中添加该代码块,然后在 catch 块中捕获异常消息并使用 Assert.assertEquals(actualErrorMessage,expectedErrorMessage)