Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Olingo/ODATA 4编写ExpressionVisitor集成测试_Java_Odata_Olingo - Fatal编程技术网

Java 使用Olingo/ODATA 4编写ExpressionVisitor集成测试

Java 使用Olingo/ODATA 4编写ExpressionVisitor集成测试,java,odata,olingo,Java,Odata,Olingo,我正在用Java语言和Olingo框架实现一个关于OData标准第4版的web服务。我需要自定义$filter的响应。我实现了一个访问者。我需要实现一个集成测试来尝试一种不同的语法,并防止将来维护时出现回归错误 对于V2,我找到了以下代码: @Test public void printExpressionWithProperty() throws Exception { //Use a mocked edmProvider for this tutorial TestEdmProvid

我正在用Java语言和Olingo框架实现一个关于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");
    }
}
但它不起作用,它向我发送了以下消息:

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


因此,我正在寻找使我的单元测试工作的任何想法,或者如果您有工作示例要共享…

当涉及到单元测试时,我会专注于单独测试每个过滤器方法。例如,如果
visitBinaryOperator
根据输入返回预期值,依此类推

我不是命名方面的专家,但我将您的测试称为集成测试。这里,我将重点介绍测试中准备的
FilterOption
。在您的原始应用程序中,ApacheOlingo将创建此
过滤器选项
,并且此部分已经(应该)在Olingo中进行了测试

当我使用ApacheOlingo时,我经常提到,尤其是服务器测试和服务器tecsvc。验证Olingo本身是如何测试的


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

现在,由于模型的跟踪功能(对遗留代码非常有用),我得到了新版本的
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;
}
A类实现EdmStructuredType、EdmPrimitiveType{
@凌驾
公共布尔值不可计算(EdmPrimitiveType EdmPrimitiveType){
返回false;
}
@凌驾
公共类getDefaultType(){
返回null;
}
@凌驾
公共布尔值验证(字符串s、布尔值aBoolean、整数整型、整数整型1、整数整型2、布尔值aBoolean 1){
返回false;
}
@凌驾
公共T值字符串(字符串s、布尔aBoolean、整型整数、整型整数1、整型整数2、布尔aBoolean 1、类aClass)引发EdmPrimitiveTypeException{
返回null;
}
@凌驾
公共字符串valueToString(对象o,布尔型aBoolean,整型整数,整型整数1,整型整数2,布尔型aBoolean1)引发EdmPrimitiveTypeException{
返回null;
}
@凌驾
公共字符串(字符串s){
返回null;
}
@凌驾
来自UriLiteral的公共字符串(字符串s)引发EdmPrimitiveTypeException{
返回null;
}
@凌驾
公共元素getProperty(字符串s){
返回null;
}
@凌驾
公共列表getPropertyNames(){
返回null;
}
@凌驾
公共属性getStructuralProperty(字符串s){
返回null;
}
@凌驾
公共EdmNavigationProperty getNavigationProperty(字符串s){
返回null;
}
@凌驾
公共列表getNavigationPropertyNames(){
返回null;
}
@凌驾
公共EdmStructuredType getBaseType(){
返回null;
}
@凌驾
公共布尔兼容对象(EdmType EdmType){
返回false;
}
@凌驾
公共布尔等熵类型(){
返回false;
}
@凌驾
公共布尔值(){
返回false;
}
@凌驾
公共EdmAnnotation getAnnotation(EdmTerm EdmTerm,字符串s){
返回null;
}
@凌驾
公共列表getAnnotations(){
返回null;
}
@凌驾
public FullQualifiedName getFullQualifiedName(){
返回null;
}
@凌驾
公共字符串getNamespace(){
返回null;
}
@凌驾
公共EdmTypeKind getKind(){
返回null;
}
@凌驾
公共字符串getName(){
返回null;
}
}
专用表达式parseExpression(最终字符串表达式字符串)
抛出UriParserException、UriValidationException{
UriTokenizer标记器=新的UriTokenizer(expressionString);
Edm Edm=mock(A.class,withSettings().defaultAnswer(返回\u SMART\u null));
EdmProperty employeeIdTypeEdmElement=mock(EdmProperty.class,返回\u SMART\u null);
当(edmType.getProperty(“EmployeeId”)。然后返回(MeasureTypeedElement);
当(edmType.getKind()).thenReturn(EdmTypeKind.PRIMITIVE);
当(edmType.isCompatible(new EdmDate())。然后返回(true);
当(EmployeeIDTypedElement.getName())。然后返回(“EmployeeId”);
当(EmployeeIDTypedElement.getType())。然后返回(edmType);
当(EmployeeIDTypedElement.isCollection())。然后返回(false);
final Expression Expression=new ExpressionParser(edm,odata).parse(标记器,edmType,null,null);
assertNotNull(表达式);
assertTrue(tokenizer.next(UriTokenizer.TokenKind.EOF));
返回表达式;
}

如果它对某人有帮助,maybee可以对其进行优化,免费填写以供建议。

好的,关于集成测试,我将重命名我的问题。Olingo代码源也是我灵感的主要来源。谢谢你们的建议,这似乎是一个很好的方式来解决我的问题,结合。我会让你知道它是否有效。这可不容易。。。odata服务器测试和odata服务器tecsvc模块不适用于4.5.0 olingo maven repo。是的,我只能在maven Central中找到4.0.0-beta-02-RC01。您可以尝试使用此版本,也可以自己重写所有内容。我看不到其他选项:/嗯,可能是e2e测试的选项,您可以使用OData客户端或普通HTTP客户端对准备好的数据库执行带有
$filter
的请求。老实说,我是这样测试的,并且使用了单元测试。谢谢你的建议,这是一个好主意,而且我已经实现了r