首页 > 解决方案 > 使用 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");
    }
}

它不起作用,它向我发送以下消息:

属性路径必须遵循结构化类型。

所以我正在寻找任何想法来让我的单元测试工作,或者如果你有工作示例可以分享......

标签: javaodataolingo

解决方案


当谈到单元测试时,我会专注于分别测试每个过滤器方法。就像 ifvisitBinaryOperator根据输入返回一个期望值等等。

我不是命名方面的专家,但我将您的测试称为集成测试。在这里,我将专注于在测试中FilterOption准备的测试。在您的原始应用程序中,Apache Olingo 将创建它FilterOption,并且这部分(应该)在 Olingo 中进行测试。

当我使用 Apache Olingo 时,我经常提到它的存储库,尤其是server-testserver-tecsvc。验证事物是如何在 Olingo 本身中进行测试的。

我建议看一下FilterValidator因为它可能对您的集成测试有用。


推荐阅读