我正在尝试测试从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验证器没有正确地将变量名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
除了修复和重新编译库之外我无能为力:(
答案 0 :(得分:2)
解决方案不是很简单,但很容易。我不得不嘲笑Pojo Validation库(我仍然嘲笑这个想法)。这是工作代码:
@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不同。我不得不从库中替换一个静态方法。