代码之家  ›  专栏  ›  技术社区  ›  Neil Foley

反射消隐场

  •  1
  • Neil Foley  · 技术社区  · 15 年前

    我正在编写JUnit测试框架来测试Web服务。

    输入值需要来自许多不同的来源,例如早期的Web服务调用或类中的文本。

    为了实现这一点,我有以不同方式接受不同输入的构造函数;到目前为止一切都很简单。

    问题是,WebServices还需要使用完整的数据负载和仅限强制字段的有效负载来执行。

    而是将(在某些情况下非常长的)测试 if 语句决定是否设置值,我编写了一个注释@optional。

    添加此注释会导致以下代码为空:

         /**
         * Find all of the fields annotated with optional and null them
         * @throws IllegalAccessException 
         * @throws IllegalArgumentException 
         */
        private void blankOptionalFields() throws IllegalAccessException{
    
            for(Field field: this.getClass().getDeclaredFields()){
    
    
                Annotation optionalAnnotation = field.getAnnotation(Optional.class);
    
                if(!(field.isSynthetic()) && optionalAnnotation instanceof Optional){
    
                    field.setAccessible(true);
                    try{
                        field.set(this, null);
                    }
                    catch(IllegalArgumentException e){
                        logger.debug("Tried to set a scalar field to null!", e);
                    }
                }
            }
        }
    

    所以有两件事:

    1:虽然这是可行的,但不知何故感觉脆弱/危险,必须有更好的方法? 2:如果这不是Carzy方法,那么将标量值设置为适当值的最佳方法是什么?

    3 回复  |  直到 15 年前
        1
  •  1
  •   rsp    15 年前

    如何定义一个只包含一个方法的接口来清空可选属性?您可以测试一个对象来实现接口,并直接调用该方法。

    这比使用反射创建“捕捉所有”情况更能优雅地处理特定的异常:

    interface Blankable {
    
        /** @return true if all optional fields are successfully blanked. **/
        public boolean blankOptionalFields();
    }
    

    使用如下:

    if (obj implements Blankable) {
    
        if (!((Blankable) obj).blankOptionalFields()) {
    
            logger.debug("Could not blank optional fields for " + obj);
        }
    }
    
        2
  •  0
  •   kdgregory    15 年前

    我将重构测试,从实际的测试代码中分离出初始化代码。为此,您可以将实际的测试代码(调用Web服务的代码)放入多个测试方法之间共享的方法中。

    作为一个半相关的评论:我认为“单元”测试是独立地执行服务方法,而“集成”测试将把它作为实际的Web服务来执行。

        3
  •  0
  •   Kevin    15 年前

    我不喜欢这种方法,因为您将测试代码与生产代码混合在一起。

    如果事先知道哪些字段是必需的,是否可以在设置这些字段时循环使用它们而不使用复杂的if结构?