0

我正在尝试测试从 wsdl 生成的 Pojo 类以提高代码覆盖率,但我遇到了一个我不知道如何解决的问题。

生成的类如下所示:

 public class NOF implements java.io.Serializable {    

   private java.lang.String nOFName;    

   public java.lang.String getNOFName() {
     return this.nOFName;
   }

   public void setNOFName(java.lang.String nOFName) {
     this.nOFName = nOFName;
   }

 }

看起来 Pojo Validator 没有正确地将变量名nOFName转换为 getter getNOFName,而是寻找其他东西(我不知道是什么)。我得到的例外是:

java.lang.AssertionError: [PojoFieldImpl [field=private java.lang.String 
mypackage.NOF.nOFName, fieldGetter=null, fieldSetter=null]] is missing a getter

当我将变量的名称更改为 时NOFName,测试通过。如果我将其更改为nofName并将方法重命名为getNofName. 我知道问题出在缩写的名称上,但我真的不想更改生成的类,因为它们将来可能会重新生成。我需要编写自定义验证器吗?我猜 somoene 之前一定已经处理过这个问题(因为我认为这是一个完美的 openpojo 验证用例),但我还没有找到任何东西。

测试看起来像这样:

public class PojoTest {
    @Test
    public void testPojo() throws Exception{
        PojoValidator validator = new PojoValidator();
        validator.addRule(new GetterMustExistRule());
        validator.addRule(new SetterMustExistRule());
        validator.addTester(new GetterTester());
        validator.addTester(new SetterTester());
        for (PojoClass cls: PojoClassFactory.getPojoClasses("mypackage")){
            validator.runValidation(cls);
        }
    }
}

编辑 我已经调试了openpojo库并且它搜索getnOFName并且除了修复和重新编译库之外我无能为力:(

4

1 回答 1

2

解决方案不是很简单,但很容易。我不得不嘲笑 Pojo 验证库(我仍然嘲笑这个想法)。这是工作代码:

@RunWith(PowerMockRunner.class)
@PrepareForTest(AttributeHelper.class)
public class PojoTest {
    static  PojoValidator validator;

    @BeforeClass
    public static void setUpClass(){
        validator = new PojoValidator();
        validator.addRule(new GetterMustExistRule());
        validator.addRule(new SetterMustExistRule());
        validator.addTester(new GetterTester());
        validator.addTester(new SetterTester());
    }

    @Before
    public void setUp(){
        PowerMockito.replace(method(AttributeHelper.class, "formattedFieldName")).with(method(PojoTest.class, "formattedFieldName"));
    }

    @Test
    public void testPojo() throws Exception {
        for (PojoClass cls: PojoClassFactory.getPojoClasses("mypackage")){
               validator.runValidation(cls);
        }
    }

    private static final List<String> fieldPrefixes = new LinkedList<String>();

    private static String formattedFieldName(final String fieldName) {
        return fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1, fieldName.length());
    }
}

问题在于 wsdl2java 对 Java Beans 标准(推断名称)的解释与 PojoValidator 不同。我不得不从库中替换一种静态方法。

于 2013-10-18T11:56:09.643 回答