Java 在PODAM 7.0.0中创建递归对象时发生PodamMockeryException
我正在用Mockito和Podam编写一些JUnit测试。很多东西都工作得很好,但我在生成递归对象时在一个测试用例中遇到了一个问题 类似以下代码的代码会在Java 在PODAM 7.0.0中创建递归对象时发生PodamMockeryException,java,junit,jemos-podam,Java,Junit,Jemos Podam,我正在用Mockito和Podam编写一些JUnit测试。很多东西都工作得很好,但我在生成递归对象时在一个测试用例中遇到了一个问题 类似以下代码的代码会在manufacturePojo()行中使用podam 7.0.0.RELEASE抛出podamOckeryException: @Test public void testDoTest() { PodamFactory podamfactory = new PodamFactoryImpl(); Entity eTest
manufacturePojo()
行中使用podam 7.0.0.RELEASE抛出podamOckeryException
:
@Test
public void testDoTest() {
PodamFactory podamfactory = new PodamFactoryImpl();
Entity eTest = podamfactory.manufacturePojo(Entity.class);
...
}
下面是更多的堆栈跟踪和实体
实体是一个JPA实体,它看起来有点像以下内容:
public class Entity extends AllTheEntities {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "DOCUMENT_SEQ")
@SequenceGenerator(name = "DOCUMENT_SEQ", sequenceName = "DOCUMENT_SEQ", allocationSize = 1)
@Column(name = "DOCUMENT_ID", precision = 19)
private long objectId;
@Column(name = "NAME")
private String name;
// bi-directional many-to-one associations
@ManyToOne
@JoinColumn(name = "FK_STND_MIME_TYPE_ID", nullable = false)
private StndMimeTypeEntity stndMimeType;
@OneToMany(mappedBy = "document", cascade = CascadeType.REMOVE)
private List<FolderThingEntity> FolderThings;
@OneToMany(mappedBy = "document", cascade = CascadeType.ALL)
private List<FieldData> fieldData;
@OneToMany(mappedBy="document")
private List<PersonalFormContentEntity> personalFormContents;
public Entity() {
}
public void setName(String name) {
this.name = name;
}
public List<FieldData> getDocumentBindFieldData() {
return this.fieldData;
}
public void setDocumentBindFieldData(
List<FieldData> fieldData) {
this.fieldData = fieldData;
}
public FieldData addDocumentBindFieldData(
FieldData fieldData) {
getDocumentBindFieldData().add(fieldData);
fieldData.setDocument(this);
return fieldData;
}
@Override
public String toString() {
return "Entity [objectId=" + objectId + ", name="
+ name + ", stndMimeType=" + stndMimeType.getStndMimeTypeId() + "]";
}
public OfficeActionEntity getForm() {
FolderThingEntity fd = getFolderThings().get(0);
FolderEntity folderEntity = fd.getFolder();
return folderEntity.getForm();
}
}
公共类实体扩展了所有实体{
@身份证
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“文档顺序”)
@SequenceGenerator(name=“DOCUMENT SEQ”,sequenceName=“DOCUMENT SEQ”,allocationSize=1)
@列(name=“DOCUMENT\u ID”,精度=19)
私人长客体;
@列(name=“name”)
私有字符串名称;
//双向多对一关联
@许多酮
@JoinColumn(name=“FK\u STND\u MIME\u TYPE\u ID”,nullable=false)
私有stndMimeType实体stndMimeType;
@OneToMany(mappedBy=“document”,cascade=CascadeType.REMOVE)
私人物品清单;
@OneToMany(mappedBy=“document”,cascade=CascadeType.ALL)
私有列表字段数据;
@OneToMany(mappedBy=“document”)
私人目录;
公共实体(){
}
公共void集合名(字符串名){
this.name=名称;
}
公共列表getDocumentBindFieldData(){
返回此.fieldData;
}
公共void setDocumentBindFieldData(
列表(现场数据){
this.fieldData=fieldData;
}
公共字段数据addDocumentBindFieldData(
现场数据(现场数据){
getDocumentBindFieldData().add(fieldData);
fieldData.setDocument(本文件);
返回现场数据;
}
@凌驾
公共字符串toString(){
return“Entity[objectId=“+objectId+”,name=”
+name+”,stndMimeType=“+stndMimeType.getStndMimeTypeId()+”];
}
public OfficeActionEntity getForm(){
FolderThingEntity fd=getFolderThings().get(0);
FolderEntity FolderEntity=fd.getFolder();
返回folderEntity.getForm();
}
}
再多一点堆栈跟踪:
uk.co.jemos.podam.exceptions.PodamMockeryException
at uk.co.jemos.podam.api.PodamFactoryImpl.doManufacturePojo(PodamFactoryImpl.java:443)
at uk.co.jemos.podam.api.PodamFactoryImpl.manufacturePojo(PodamFactoryImpl.java:148)
at CENSORED(CENSOREDTest.java:261)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
... 20 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at uk.co.jemos.podam.api.PodamFactoryImpl.populatePojoInternal(PodamFactoryImpl.java:694)
at uk.co.jemos.podam.api.PodamFactoryImpl.manufacturePojoInternal(PodamFactoryImpl.java:532)
at uk.co.jemos.podam.api.PodamFactoryImpl.manufactureAttributeValue(PodamFactoryImpl.java:885)
at uk.co.jemos.podam.api.PodamFactoryImpl.populatePojoInternal(PodamFactoryImpl.java:687)
at uk.co.jemos.podam.api.PodamFactoryImpl.manufacturePojoInternal(PodamFactoryImpl.java:532)
at uk.co.jemos.podam.api.PodamFactoryImpl.doManufacturePojo(PodamFactoryImpl.java:436)
... 30 more
Caused by: java.lang.IllegalArgumentException: nanos > 999999999 or < 0
at java.sql.Timestamp.setNanos(Timestamp.java:386)
... 40 more
uk.co.jemos.podam.exceptions.PodamMockeryException
位于uk.co.jemos.podam.api.PodamFactoryImpl.doManufacturePojo(PodamFactoryImpl.java:443)
位于uk.co.jemos.podam.api.PodamFactoryImpl.manufacturePojo(PodamFactoryImpl.java:148)
在审查时(CENSOREDTest.java:261)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:606)
位于org.junit.runners.model.FrameworkMethod$1.runReflectVeCall(FrameworkMethod.java:47)
位于org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
位于org.junit.runners.model.FrameworkMethod.invokeeexplosive(FrameworkMethod.java:44)
位于org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
... 20多
原因:java.lang.reflect.InvocationTargetException
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:606)
位于uk.co.jemos.podam.api.PodamFactoryImpl.PopulateProject(PodamFactoryImpl.java:694)
位于uk.co.jemos.podam.api.PodamFactoryImpl.manufacturePojoInternal(PodamFactoryImpl.java:532)
位于uk.co.jemos.podam.api.PodamFactoryImpl.manufactureAttributeValue(PodamFactoryImpl.java:885)
位于uk.co.jemos.podam.api.PodamFactoryImpl.PopulateProject(PodamFactoryImpl.java:687)
位于uk.co.jemos.podam.api.PodamFactoryImpl.manufacturePojoInternal(PodamFactoryImpl.java:532)
位于uk.co.jemos.podam.api.PodamFactoryImpl.doManufacturePojo(PodamFactoryImpl.java:436)
... 30多
原因:java.lang.IllegalArgumentException:nanos>9999999或<0
位于java.sql.Timestamp.setNanos(Timestamp.java:386)
... 40多
我猜FieldData
对象包含java.sql.Timestamp
或扩展它。后者要求其设置程序具有非常特定的值。因此,需要为这个类定制定制随机值。下面是一个示例,说明如何实现这一点:
PodamFactory podamFactory = new PodamFactoryImpl();
TypeManufacturer<Integer> manufacturer = new IntTypeManufacturerImpl() {
@Override
public Integer getInteger(AttributeMetadata attributeMetadata) {
if (attributeMetadata.getPojoClass() instanceof Timestamp) {
return PodamUtils.getIntegerInRange(0, 999999999);
} else {
return super.getInteger(attributeMetadata);
}
}
};
podamFactory.getStrategy().addOrReplaceTypeManufacturer(int.class, manufacturer);
FieldData pojo = podamFactory.manufacturePojo(FieldData.class);
PodamFactory PodamFactory=new PodamFactoryImpl();
TypeManufacturer=新的IntTypeManufacturerImpl(){
@凌驾
公共整数getInteger(AttributeMetadata AttributeMetadata){
if(attributeMetadata.getPojoClass()instanceof Timestamp){
返回PodamUtils.getIntegerRange(099999999);
}否则{
返回super.getInteger(attributeMetadata);
}
}
};
podamFactory.getStrategy().addorreplaceTypeMacturer(int.class,manufacturer);
FieldData pojo=podamFactory.manufacturePojo(FieldData.class);
我猜FieldData
对象包含java.sql.Timestamp
或扩展它。后者要求其设置程序具有非常特定的值。因此,需要为这个类定制定制随机值。下面是一个示例,说明如何实现这一点:
PodamFactory podamFactory = new PodamFactoryImpl();
TypeManufacturer<Integer> manufacturer = new IntTypeManufacturerImpl() {
@Override
public Integer getInteger(AttributeMetadata attributeMetadata) {
if (attributeMetadata.getPojoClass() instanceof Timestamp) {
return PodamUtils.getIntegerInRange(0, 999999999);
} else {
return super.getInteger(attributeMetadata);
}
}
};
podamFactory.getStrategy().addOrReplaceTypeManufacturer(int.class, manufacturer);
FieldData pojo = podamFactory.manufacturePojo(FieldData.class);
PodamFactory PodamFactory=new PodamFactoryImpl();
TypeManufacturer=新的IntTypeManufacturerImpl(){
@凌驾
公共整数getInteger(AttributeMetadata AttributeMetadata){
if(attributeMetadata.getPojoClass()instanceof Timestamp){
返回PodamUtils.getIntegerRange(099999999);
}否则{
返回super.getInteger(attributeMetadata);
}
}
};
podamFactory.getStrategy().addorreplaceTypeMacturer(int.class,manufacturer);
FieldData pojo=podamFactory.manufacturePojo(FieldData.class);