2016-08-19 102 views
2

我的POJO:關閉java.langObject初始化在podam

class PersonJob { 

private PersonAddress address; 

//a buch of fields (non Object type) 
} 

class PersonAddress extends AbstractContact { 
//empty fields class 
} 

class AbstractContact { 
    private Object contactId; 

    public Object getContactId() { return this.contactId } 

    public void setContactId(Object contactId) {this.contactId = contactId} 
} 

AbstractContact類放在外部庫。

我使用PodamFactory和我的DataProvider,它擴展AsbractRandomDataProviderStrategy來填充PersonJob。但是,當JAXB序列化它,我的Git這樣的錯誤:

java.lang.ClassCastException: java.lang.Object incompatible with org.w3c.dom.Element 
       at com.sun.xml.bind.v2.runtime.AnyTypeBeanInfo.serializeURIs(AnyTypeBeanInfo.java:153) 
       at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:677) 
       at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:158) 
       at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:360) 
       at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696) 
       at com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:69) 
       at com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:172) 
       at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:159) 
       at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:360) 
       at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:593) 
       at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:341) 
       at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:494) 
       at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:323) 
       at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:251) 
       at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:128) 
       at ru.sbrf.bh.banking.product.pcard.branchpcard.orchestration.ValidatePersonProcess.marshallObject(ValidatePersonProcess.java:76) 
       at ru.sbrf.bh.banking.product.pcard.branchpcard.orchestration.ValidatePersonProcess.validatePerson(ValidatePersonProcess.java:60) 
       at ru.sbrf.bh.banking.product.pcard.branchpcard.service.flow.card.PersonValidationTest.testFilledValidation(PersonValidationTest.java:74) 
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:95) 
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:56) 
       at java.lang.reflect.Method.invoke(Method.java:620) 
       at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:86) 
       at org.testng.internal.Invoker.invokeMethod(Invoker.java:643) 
       at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:820) 
       at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1128) 
       at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129) 
       at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112) 
       at org.testng.TestRunner.privateRun(TestRunner.java:782) 
       at org.testng.TestRunner.run(TestRunner.java:632) 
       at org.testng.SuiteRunner.runTest(SuiteRunner.java:366) 
       at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:361) 
       at org.testng.SuiteRunner.privateRun(SuiteRunner.java:319) 
       at org.testng.SuiteRunner.run(SuiteRunner.java:268) 
       at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 
       at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 
       at org.testng.TestNG.runSuitesSequentially(TestNG.java:1244) 
       at org.testng.TestNG.runSuitesLocally(TestNG.java:1169) 
       at org.testng.TestNG.run(TestNG.java:1064) 
       at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72) 
       at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:122) 
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:95) 
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:56) 
       at java.lang.reflect.Method.invoke(Method.java:620) 
       at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 

有沒有辦法通過的DataProvider其延伸AsbractRandomDataProviderStrategy關掉的ContactID領域的實例化AbstractContact類?

回答

0

首先,您可以將contactId更改爲實際類型嗎?我在運行時打賭它不是Object,但它宣稱它會混淆Podam。

如果前者不是一種選擇,那麼你可以做三件事情:

  1. 排除contactId@PodamExclude註釋
  2. 排除contactId現場帶班的信息戰略

    DefaultClassInfoStrategy classInfoStrategy = DefaultClassInfoStrategy.getInstance(); classInfoStrategy.addExcludedField(PersonAddress.class,「contactId」); podamFactory.setClassStrategy(classInfoStrategy);

  3. 製造,甚至更好pojo.setContactId(yourActualAddressObject);

+0

第二個變量止跌回升是在我的情況下,最方便的解決方案,因爲我不能修改從外部庫的POJO後直接讓pojo.setContactId(null);。 Thaks爲您的答案! –