Написание интеграционного теста ExpressionVisitor с Olingo / ODATA 4 - PullRequest
0 голосов
/ 16 января 2019

Я реализую веб-службу, соответствующую версии 4 стандарта OData на языке Java, с помощью инфраструктуры Olingo. Мне нужно настроить ответ $filter. Я реализовал Visitor , как описано в кратком руководстве . Мне нужно реализовать интеграционный тест, чтобы попробовать другой вид грамматики и предотвратить ошибку регрессии в случае дальнейшего обслуживания.

Для 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");
    }
}

И это не работает, оно отправляет мне следующее сообщение:

Пути к свойствам должны соответствовать структурированному типу.

Так что я ищу какие-нибудь идеи, чтобы заставить мой модульный тест работать или если у вас есть рабочий пример, чтобы поделиться ...

Ответы [ 2 ]

0 голосов
/ 13 августа 2019

Итак, благодаря функции трассировки макета (очень полезной для устаревшего кода), у меня есть новая версия метода parseExpression, которая отвечает на мой вопрос.

class A implements EdmStructuredType, EdmPrimitiveType {

    @Override
    public boolean isCompatible(EdmPrimitiveType edmPrimitiveType) {
        return false;
    }

    @Override
    public Class<?> getDefaultType() {
        return null;
    }

    @Override
    public boolean validate(String s, Boolean aBoolean, Integer integer, Integer integer1, Integer integer2, Boolean aBoolean1) {
        return false;
    }

    @Override
    public <T> T valueOfString(String s, Boolean aBoolean, Integer integer, Integer integer1, Integer integer2, Boolean aBoolean1, Class<T> aClass) throws EdmPrimitiveTypeException {
        return null;
    }

    @Override
    public String valueToString(Object o, Boolean aBoolean, Integer integer, Integer integer1, Integer integer2, Boolean aBoolean1) throws EdmPrimitiveTypeException {
        return null;
    }

    @Override
    public String toUriLiteral(String s) {
        return null;
    }

    @Override
    public String fromUriLiteral(String s) throws EdmPrimitiveTypeException {
        return null;
    }

    @Override
    public EdmElement getProperty(String s) {
        return null;
    }

    @Override
    public List<String> getPropertyNames() {
        return null;
    }

    @Override
    public EdmProperty getStructuralProperty(String s) {
        return null;
    }

    @Override
    public EdmNavigationProperty getNavigationProperty(String s) {
        return null;
    }

    @Override
    public List<String> getNavigationPropertyNames() {
        return null;
    }

    @Override
    public EdmStructuredType getBaseType() {
        return null;
    }

    @Override
    public boolean compatibleTo(EdmType edmType) {
        return false;
    }

    @Override
    public boolean isOpenType() {
        return false;
    }

    @Override
    public boolean isAbstract() {
        return false;
    }

    @Override
    public EdmAnnotation getAnnotation(EdmTerm edmTerm, String s) {
        return null;
    }

    @Override
    public List<EdmAnnotation> getAnnotations() {
        return null;
    }

    @Override
    public FullQualifiedName getFullQualifiedName() {
        return null;
    }

    @Override
    public String getNamespace() {
        return null;
    }

    @Override
    public EdmTypeKind getKind() {
        return null;
    }

    @Override
    public String getName() {
        return null;
    }
}


private Expression parseExpression(final String expressionString)
        throws UriParserException, UriValidationException {

    UriTokenizer tokenizer = new UriTokenizer(expressionString);

    Edm edm = mock(A.class, withSettings().defaultAnswer(RETURNS_SMART_NULLS));
    EdmProperty employeeIdTypeEdmElement = mock(EdmProperty.class, RETURNS_SMART_NULLS);

    when(edmType.getProperty("EmployeeId")).thenReturn(measureTypeEdmElement);

    when(edmType.getKind()).thenReturn(EdmTypeKind.PRIMITIVE);
    when(edmType.isCompatible(new EdmDate())).thenReturn(true);

    when(employeeIdTypeEdmElement.getName()).thenReturn("EmployeeId");
    when(employeeIdTypeEdmElement.getType()).thenReturn(edmType);
    when(employeeIdTypeEdmElement.isCollection()).thenReturn(false);


    final Expression expression = new ExpressionParser(edm, odata).parse(tokenizer, edmType, null, null);
    assertNotNull(expression);
    assertTrue(tokenizer.next(UriTokenizer.TokenKind.EOF));
    return expression;
}

В случае, если это кому-то поможет, может быть, это можно оптимизировать, напишите бесплатно.

0 голосов
/ 19 января 2019

Когда дело доходит до модульных тестов , я бы сосредоточился на тестировании каждого метода фильтрации отдельно. Например, если visitBinaryOperator возвращает ожидаемое значение на основе ввода и т. Д.

Я не специалист по именованию вещей, но я бы назвал ваш тест интеграционным тестом . Здесь я бы сосредоточился на тестировании FilterOption, подготовленном внутри теста. В вашем исходном приложении Apache Olingo создаст этот FilterOption, и эта часть (должна быть) протестирована в Olingo.

Когда я работал с Apache Olingo, я часто ссылался на его хранилище , особенно на server-test и server-tecsvc . Чтобы проверить, как все тестируется в самом Olingo.

Я бы рекомендовал взглянуть на FilterValidator , так как это может быть чем-то полезным для вашего интеграционного теста.

...