java - 使用 Olingo / ODATA 4 编写 ExpressionVisitor 的集成测试
问题描述
我正在使用框架 Olingo 以 Java 语言实现尊重 OData 标准第 4 版的 Web 服务。我需要自定义$filter
. 我已经实现了快速入门中记录的访客。我需要实现一个集成测试来尝试不同类型的语法并防止在未来维护时出现回归错误。
对于 V2,我找到了以下教程和以下代码:
@Test
public void printExpressionWithProperty() throws Exception {
//Use a mocked edmProvider for this tutorial
TestEdmProvider provider = new TestEdmProvider();
Edm edm = RuntimeDelegate.createEdm(provider);
EdmEntityType entityType = edm.getEntityType(TestEdmProvider.NAMESPACE_1, TestEdmProvider.ENTITY_TYPE_1_1.getName());
String rawExpression = "EmployeeId eq '1'";
FilterExpression expression = UriParser.parseFilter (null, entityType, rawExpression);
String whereClause = (String) expression.accept(new JdbcSimpleStringVisitor());
System.out.println("Raw: " + rawExpression + " ------> Whereclause: " + whereClause);
System.out.println();
}
不幸的是,UriParser.parseFilter
在 v4 中不存在。
我试过这个:
public class MyVisitorTest {
private final FullQualifiedName NAME1 = new FullQualifiedName("testNamespace1", "myfield");
private final OData odata = OData.newInstance();
public EdmEntityType createEntityType(final FullQualifiedName fqn) {
if (NAME1.equals(fqn)) {
EdmEntityType entityType = mock(EdmEntityType.class);
when(entityType.getNamespace()).thenReturn(fqn.getNamespace());
when(entityType.getName()).thenReturn(fqn.getName());
return entityType;
}
return null;
}
private Expression parseExpression(final String expressionString)
throws UriParserException, UriValidationException {
UriTokenizer tokenizer = new UriTokenizer(expressionString);
EdmEntityType entityType = createEntityType(NAME1);
Edm edm = mock(Edm.class);
when(edm.getEntityType(NAME1)).thenReturn(entityType);
final Expression expression = new ExpressionParser(edm, odata).parse(tokenizer, null, null, null);
assertNotNull(expression);
assertTrue(tokenizer.next(UriTokenizer.TokenKind.EOF));
return expression;
}
@Test
public void simpleTest() throws UriParserException, UriValidationException, ODataApplicationException, ExpressionVisitException {
String exp = "myfield gt 2019-01-01T00:00:00Z";
Expression e = parseExpression(exp);
MyVisitor myVisitor = new MyVisitor();
String result = (String) e.accept(startEndMeasureVisitor);
assertEquals(result.toString(), "MyResult");
}
}
它不起作用,它向我发送以下消息:
属性路径必须遵循结构化类型。
所以我正在寻找任何想法来让我的单元测试工作,或者如果你有工作示例可以分享......
解决方案
当谈到单元测试时,我会专注于分别测试每个过滤器方法。就像 ifvisitBinaryOperator
根据输入返回一个期望值等等。
我不是命名方面的专家,但我将您的测试称为集成测试。在这里,我将专注于在测试中FilterOption
准备的测试。在您的原始应用程序中,Apache Olingo 将创建它FilterOption
,并且这部分(应该)在 Olingo 中进行测试。
当我使用 Apache Olingo 时,我经常提到它的存储库,尤其是server-test和server-tecsvc。验证事物是如何在 Olingo 本身中进行测试的。
我建议看一下FilterValidator因为它可能对您的集成测试有用。
推荐阅读
- laravel-5 - 未定义变量:数据(查看:C:\xampp\htdocs\lsapp\resources\views\complete.blade.php)
- python - Python-MySQL:如何在 python 脚本中创建选择(where 子句)查询?
- android - 动态更改视图类型 RecylerView
- c++ - glReadPixels 和 gluUnProject 无法正常工作
- git - 在 GitLab 中打开 Word 文件而不是下载
- python - 为什么python必须生成完整范围来测试是否在范围内浮动?
- hive - Wince:重新启动后重置配置单元的值?
- scala - Scala:在每行的末尾添加值,文件中的最后一行除外
- react-native - 反应式编程与本机反应有关吗?
- ios - 在swift 4.0中将值附加到数组后如何重新加载tableView