OpenPojo / openpojo

POJO Testing & Identity Management Made Trivial
http://openpojo.com
Apache License 2.0
156 stars 40 forks source link

Problems running OpenPojo #72

Closed johngluck65 closed 8 years ago

johngluck65 commented 8 years ago

It appears that OpenPojo is attempting generate a pojo Test for java.util.UUID. I'm not certain how to prevent this from happening.

I have a pojo that looks like this (fields were removed). As far as I can tell, this logic in DefaultRandomGenerator appears to be incorrect in that I'm uncertain as to why one would generate a pojo if you get here. Perhaps I'm mistaken.

public Object doGenerate(final Class<?> type) {
    final PojoClass typePojoClass = PojoClassFactory.getPojoClass(type);
    if (typePojoClass.isInterface()) {
        return interfaceRandomGenerator.doGenerate(type);
    }

    if (typePojoClass.isEnum()) {
        return enumRandomGenerator.doGenerate(type);
    }

    if (typePojoClass.isArray()) {
        return arrayRandomGenerator.doGenerate(type);
    }

    LoggerFactory.getLogger(DefaultRandomGenerator.class).debug("Creating basic instance for type=[{0}] using InstanceFactory", type);
    return InstanceFactory.getLeastCompleteInstance(PojoClassFactory.getPojoClass(type));

}

At any rate, when I run the LessThan.compare, the lefthand array contains two longs, and the rightHand contains something that looks like class B[. I'm expecting it to contain a byte array.

I'm using version 0.8.1. please advise.

---------POJO-------------- package

import java.util.UUID;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown=true) public class User {

private UUID userUuid;

public UUID getUserUuid() {
    return userUuid;
}
public void setUserUuid( UUID userUuid ) {
    this.userUuid = userUuid;

} }

My test code is below

package

import java.util.ArrayList; import java.util.Iterator; import java.util.List;

import org.junit.Before; import org.junit.Test;

import com.openpojo.reflection.PojoClass; import com.openpojo.reflection.PojoClassFilter; import com.openpojo.reflection.filters.FilterSyntheticClasses; import com.openpojo.reflection.impl.PojoClassFactory; import com.openpojo.validation.PojoValidator; import com.openpojo.validation.Validator; import com.openpojo.validation.ValidatorBuilder; import com.openpojo.validation.test.impl.GetterTester; import com.openpojo.validation.test.impl.SetterTester;

public class OpenPojoTest {

//private PojoClassFilter filter; protected String[] packageNames = new String[1]; //private List pojoClasses = new ArrayList(); private Validator pojoValidator;

public OpenPojoTest() { }

@Before public void setup() { pojoValidator = ValidatorBuilder.create() .with(new SetterTester(), new GetterTester()) .build(); // Get all classes recursively under package

}

@Test public void validate() {

for (String packageName : packageNames) {
  pojoValidator.validate(packageName);
}

} } package

import OpenPojoTest;

public class ClientOpenPojoTest extends OpenPojoTest {

public ClientOpenPojoTest() { packageNames[0] = ""; }

}

package

import java.util.UUID;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown=true) public class User {

private UUID userUuid;

public UUID getUserUuid() {
    return userUuid;
}
public void setUserUuid( UUID userUuid ) {
    this.userUuid = userUuid;

} }

I am getting the following exception

com.openpojo.reflection.exception.ReflectionException: Failed to create instance for class [com.openpojo.reflection.impl.PojoClassImpl [clazz=class java.util.UUID, pojoFields=[PojoFieldImpl [field=private static final long java.util.UUID.serialVersionUID, fieldGetter=null, fieldSetter=null], PojoFieldImpl [field=private final long java.util.UUID.mostSigBits, fieldGetter=null, fieldSetter=null], PojoFieldImpl [field=private final long java.util.UUID.leastSigBits, fieldGetter=null, fieldSetter=null], PojoFieldImpl [field=private transient int java.util.UUID.version, fieldGetter=null, fieldSetter=null], PojoFieldImpl [field=private transient int java.util.UUID.variant, fieldGetter=null, fieldSetter=null], PojoFieldImpl [field=private transient volatile long java.util.UUID.timestamp, fieldGetter=null, fieldSetter=null], PojoFieldImpl [field=private transient int java.util.UUID.sequence, fieldGetter=null, fieldSetter=null], PojoFieldImpl [field=private transient long java.util.UUID.node, fieldGetter=null, fieldSetter=null], PojoFieldImpl [field=private transient int java.util.UUID.hashCode, fieldGetter=null, fieldSetter=null], PojoFieldImpl [field=static final boolean java.util.UUID.$assertionsDisabled, fieldGetter=null, fieldSetter=null]], pojoMethods=[PojoMethodImpl [constructor=java.util.UUID args=[class [B] return=class java.util.UUID], PojoMethodImpl [constructor=java.util.UUID args=[long, long] return=class java.util.UUID], PojoMethodImpl [method=equals args=[class java.lang.Object] return=boolean], PojoMethodImpl [method=toString args=[] return=class java.lang.String], PojoMethodImpl [method=hashCode args=[] return=int], PojoMethodImpl [method=compareTo args=[class java.util.UUID] return=int], PojoMethodImpl [method=compareTo args=[class java.lang.Object] return=int], PojoMethodImpl [method=timestamp args=[] return=long], PojoMethodImpl [method=readObject args=[class java.io.ObjectInputStream] return=void], PojoMethodImpl [method=digits args=[long, int] return=class java.lang.String], PojoMethodImpl [method=variant args=[] return=int], PojoMethodImpl [method=version args=[] return=int], PojoMethodImpl [method=node args=[] return=long], PojoMethodImpl [method=randomUUID args=[] return=class java.util.UUID], PojoMethodImpl [method=nameUUIDFromBytes args=[class [B] return=class java.util.UUID], PojoMethodImpl [method=fromString args=[class java.lang.String] return=class java.util.UUID], PojoMethodImpl [method=getLeastSignificantBits args=[] return=long], PojoMethodImpl [method=getMostSignificantBits args=[] return=long], PojoMethodImpl [method=clockSequence args=[] return=int]]]] using constructor [PojoMethodImpl [constructor=java.util.UUID args=[class [B] return=class java.util.UUID]] at com.openpojo.reflection.exception.ReflectionException.getInstance(ReflectionException.java:53) at com.openpojo.reflection.construct.InstanceFactory.createInstance(InstanceFactory.java:233) at com.openpojo.reflection.construct.InstanceFactory.getLeastCompleteInstance(InstanceFactory.java:170) at com.openpojo.random.impl.DefaultRandomGenerator.doGenerate(DefaultRandomGenerator.java:62) at com.openpojo.random.RandomFactory.getRandomValue(RandomFactory.java:100) at com.openpojo.random.RandomFactory.getRandomValue(RandomFactory.java:108) at com.openpojo.validation.test.impl.SetterTester.run(SetterTester.java:43) at com.openpojo.validation.utils.ValidationHelper.runValidation(ValidationHelper.java:104) at com.openpojo.validation.impl.DefaultValidator.validate(DefaultValidator.java:46) at com.openpojo.validation.impl.DefaultValidator.validate(DefaultValidator.java:51) at com.openpojo.validation.impl.DefaultValidator.validate(DefaultValidator.java:57) at .OpenPojoTest.validate(OpenPojoTest.java:44) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) 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) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) at org.junit.runners.ParentRunner.run(ParentRunner.java:309) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) Caused by: com.openpojo.reflection.exception.ReflectionException at com.openpojo.reflection.exception.ReflectionException.getInstance(ReflectionException.java:53) at com.openpojo.reflection.impl.PojoMethodImpl.invoke(PojoMethodImpl.java:86) at com.openpojo.reflection.construct.InstanceFactory.doGetInstance(InstanceFactory.java:96) at com.openpojo.reflection.construct.InstanceFactory.getInstance(InstanceFactory.java:81) at com.openpojo.reflection.construct.InstanceFactory.createInstance(InstanceFactory.java:231) ... 34 more Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.openpojo.reflection.impl.PojoMethodImpl.invoke(PojoMethodImpl.java:78) ... 37 more Caused by: java.lang.ArrayIndexOutOfBoundsException: 5 at java.util.UUID.(UUID.java:126) ... 42 more

johngluck65 commented 8 years ago

I solved this by writing a filter that excludes classes if a field is of a given type. However, it seems to me that in order to be more useful, there should be a way to extend the Random generators to prevent problems such as that.

oshoukry commented 8 years ago

Thank you for raising the issue, I'll have confirmed the issue and it will be fixed in the next release.

oshoukry commented 8 years ago

Please download the latest release which addresses the issue raised.