From b2e0a20235cfa2b92b793c760b79a953c53d2884 Mon Sep 17 00:00:00 2001 From: bobrivers Date: Wed, 7 Sep 2016 12:21:34 -0300 Subject: [PATCH 1/2] Introduces the possibility to skip some fields during Getter/Setter validation. Sometimes when build unit tests for legacy code, you can find bad programming from people that put business logic inside getter/setter. And, since you cannot refactor it, OpenPojo fails. To avoid skipping the entire class because a field, this modification helps it. --- .../validation/test/impl/GetterTester.java | 26 ++++++++ .../validation/test/impl/SetterTester.java | 65 ++++++++++++++----- .../openpojo/validation/test/impl/Person.java | 13 ++++ .../test/impl/SetterTesterTest.java | 31 +++++++++ 4 files changed, 117 insertions(+), 18 deletions(-) create mode 100644 src/test/java/com/openpojo/validation/test/impl/Person.java create mode 100644 src/test/java/com/openpojo/validation/test/impl/SetterTesterTest.java diff --git a/src/main/java/com/openpojo/validation/test/impl/GetterTester.java b/src/main/java/com/openpojo/validation/test/impl/GetterTester.java index 0c175149..119807f5 100644 --- a/src/main/java/com/openpojo/validation/test/impl/GetterTester.java +++ b/src/main/java/com/openpojo/validation/test/impl/GetterTester.java @@ -18,6 +18,9 @@ package com.openpojo.validation.test.impl; +import java.util.HashSet; +import java.util.Set; + import com.openpojo.log.LoggerFactory; import com.openpojo.random.RandomFactory; import com.openpojo.reflection.PojoClass; @@ -34,9 +37,16 @@ */ public class GetterTester implements Tester { + private Set skippedFields = new HashSet(); + public void run(final PojoClass pojoClass) { final Object classInstance = ValidationHelper.getBasicInstance(pojoClass); for (final PojoField fieldEntry : pojoClass.getPojoFields()) { + if (skippedFields.contains(fieldEntry.getName())) { + LoggerFactory.getLogger(this.getClass()).debug("Skipping field [{0}]", fieldEntry); + continue; + } + if (fieldEntry.hasGetter()) { Object value = fieldEntry.get(classInstance); @@ -57,4 +67,20 @@ public void run(final PojoClass pojoClass) { } } } + + /** + * Instructs GetterTester to skip the field when running pojoClass + * validation. + * + * @param fieldToBeSkipped + * Field name (e.g. Into Person class, to skip getName, provide + * "name" as a field to be skipped. + */ + public void addField(String fieldToBeSkipped) { + if (fieldToBeSkipped == null || fieldToBeSkipped.trim().isEmpty()) { + throw new IllegalArgumentException("The argument 'fieldToBeSkipped' cannot be null or empty."); + } + + this.skippedFields.add(fieldToBeSkipped); + } } diff --git a/src/main/java/com/openpojo/validation/test/impl/SetterTester.java b/src/main/java/com/openpojo/validation/test/impl/SetterTester.java index 1a1af225..e2544f82 100644 --- a/src/main/java/com/openpojo/validation/test/impl/SetterTester.java +++ b/src/main/java/com/openpojo/validation/test/impl/SetterTester.java @@ -18,6 +18,10 @@ package com.openpojo.validation.test.impl; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + import com.openpojo.log.LoggerFactory; import com.openpojo.random.RandomFactory; import com.openpojo.reflection.PojoClass; @@ -28,32 +32,57 @@ import com.openpojo.validation.utils.ValidationHelper; /** - * Test the setter and ensure it sets the field being tested if and only if a Setter method was defined. + * Test the setter and ensure it sets the field being tested if and only if a + * Setter method was defined. * * @author oshoukry */ public class SetterTester implements Tester { - public void run(final PojoClass pojoClass) { - final Object classInstance = ValidationHelper.getBasicInstance(pojoClass); - for (final PojoField fieldEntry : pojoClass.getPojoFields()) { - if (fieldEntry.hasSetter()) { - final Object value; + private Set skippedFields = new HashSet(); + + public void run(final PojoClass pojoClass) { + final Object classInstance = ValidationHelper.getBasicInstance(pojoClass); + for (final PojoField fieldEntry : pojoClass.getPojoFields()) { + if (skippedFields.contains(fieldEntry.getName())) { + LoggerFactory.getLogger(this.getClass()).debug("Skipping field [{0}]", fieldEntry); + continue; + } + + if (fieldEntry.hasSetter()) { + final Object value; + + value = RandomFactory.getRandomValue(fieldEntry); + + IdentityHandlerStub.registerIdentityHandlerStubForValue(value); + LoggerFactory.getLogger(this.getClass()).debug("Testing Field [{0}] with random value [{1}]", + fieldEntry, value); - value = RandomFactory.getRandomValue(fieldEntry); + fieldEntry.invokeSetter(classInstance, value); - IdentityHandlerStub.registerIdentityHandlerStubForValue(value); - LoggerFactory.getLogger(this.getClass()).debug("Testing Field [{0}] with random value [{1}]", fieldEntry, value); + Affirm.affirmEquals("Setter test failed, non equal value for field=[" + fieldEntry + "]", value, + fieldEntry.get(classInstance)); - fieldEntry.invokeSetter(classInstance, value); + IdentityHandlerStub.unregisterIdentityHandlerStubForValue(value); + } else { + LoggerFactory.getLogger(this.getClass()).debug("Field [{0}] has no setter skipping", fieldEntry); + } + } + } - Affirm.affirmEquals("Setter test failed, non equal value for field=[" + fieldEntry + "]", value, - fieldEntry.get(classInstance)); + /** + * Instructs SetterTester to skip the field when running pojoClass + * validation. + * + * @param fieldToBeSkipped + * Field name (e.g. Into Person class, to skip setName, provide + * "name" as a field to be skipped. + */ + public void addField(String fieldToBeSkipped) { + if (fieldToBeSkipped == null || fieldToBeSkipped.trim().isEmpty()) { + throw new IllegalArgumentException("The argument 'fieldToBeSkipped' cannot be null or empty."); + } - IdentityHandlerStub.unregisterIdentityHandlerStubForValue(value); - } else { - LoggerFactory.getLogger(this.getClass()).debug("Field [{0}] has no setter skipping", fieldEntry); - } - } - } + this.skippedFields.add(fieldToBeSkipped); + } } diff --git a/src/test/java/com/openpojo/validation/test/impl/Person.java b/src/test/java/com/openpojo/validation/test/impl/Person.java new file mode 100644 index 00000000..dbcf82cd --- /dev/null +++ b/src/test/java/com/openpojo/validation/test/impl/Person.java @@ -0,0 +1,13 @@ +package com.openpojo.validation.test.impl; + +public class Person { + private String name; + + public void setName(String name) { + this.name = "bad programming"; + } + + public String getName() { + return "bad programming"; + } +} diff --git a/src/test/java/com/openpojo/validation/test/impl/SetterTesterTest.java b/src/test/java/com/openpojo/validation/test/impl/SetterTesterTest.java new file mode 100644 index 00000000..74fd0e36 --- /dev/null +++ b/src/test/java/com/openpojo/validation/test/impl/SetterTesterTest.java @@ -0,0 +1,31 @@ +package com.openpojo.validation.test.impl; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import com.openpojo.reflection.PojoClass; +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.rule.impl.GetterMustExistRule; +import com.openpojo.validation.rule.impl.SetterMustExistRule; + +public class SetterTesterTest { + + @Test + public void test() { + PojoClass personPojo = PojoClassFactory.getPojoClass(Person.class); + + SetterTester setterTester = new SetterTester(); + setterTester.addField("name"); + + GetterTester getterTester = new GetterTester(); + getterTester.addField("name"); + + Validator validator = ValidatorBuilder.create().with(setterTester).with(getterTester).build(); + + validator.validate(personPojo); + } +} From 988e2020697c415e3277adac029332c663a56478 Mon Sep 17 00:00:00 2001 From: bobrivers Date: Wed, 7 Sep 2016 12:36:58 -0300 Subject: [PATCH 2/2] Introduces the possibility to skip some fields during Getter/Setter validation. Sometimes when build unit tests for legacy code, you can find bad programming from people that put business logic inside getter/setter. And, since you cannot refactor it, OpenPojo fails. To avoid skipping the entire class because a field, this modification helps it. --- .../validation/test/impl/SetterTester.java | 85 +++++++++---------- 1 file changed, 41 insertions(+), 44 deletions(-) diff --git a/src/main/java/com/openpojo/validation/test/impl/SetterTester.java b/src/main/java/com/openpojo/validation/test/impl/SetterTester.java index e2544f82..49fd3fa5 100644 --- a/src/main/java/com/openpojo/validation/test/impl/SetterTester.java +++ b/src/main/java/com/openpojo/validation/test/impl/SetterTester.java @@ -18,7 +18,6 @@ package com.openpojo.validation.test.impl; -import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -32,57 +31,55 @@ import com.openpojo.validation.utils.ValidationHelper; /** - * Test the setter and ensure it sets the field being tested if and only if a - * Setter method was defined. + * Test the setter and ensure it sets the field being tested if and only if a Setter method was defined. * * @author oshoukry */ public class SetterTester implements Tester { - private Set skippedFields = new HashSet(); + private Set skippedFields = new HashSet(); + + public void run(final PojoClass pojoClass) { + final Object classInstance = ValidationHelper.getBasicInstance(pojoClass); + for (final PojoField fieldEntry : pojoClass.getPojoFields()) { + if (skippedFields.contains(fieldEntry.getName())) { + LoggerFactory.getLogger(this.getClass()).debug("Skipping field [{0}]", fieldEntry); + continue; + } + + if (fieldEntry.hasSetter()) { + final Object value; - public void run(final PojoClass pojoClass) { - final Object classInstance = ValidationHelper.getBasicInstance(pojoClass); - for (final PojoField fieldEntry : pojoClass.getPojoFields()) { - if (skippedFields.contains(fieldEntry.getName())) { - LoggerFactory.getLogger(this.getClass()).debug("Skipping field [{0}]", fieldEntry); - continue; - } + value = RandomFactory.getRandomValue(fieldEntry); - if (fieldEntry.hasSetter()) { - final Object value; + IdentityHandlerStub.registerIdentityHandlerStubForValue(value); + LoggerFactory.getLogger(this.getClass()).debug("Testing Field [{0}] with random value [{1}]", fieldEntry, value); - value = RandomFactory.getRandomValue(fieldEntry); + fieldEntry.invokeSetter(classInstance, value); - IdentityHandlerStub.registerIdentityHandlerStubForValue(value); - LoggerFactory.getLogger(this.getClass()).debug("Testing Field [{0}] with random value [{1}]", - fieldEntry, value); + Affirm.affirmEquals("Setter test failed, non equal value for field=[" + fieldEntry + "]", value, + fieldEntry.get(classInstance)); - fieldEntry.invokeSetter(classInstance, value); + IdentityHandlerStub.unregisterIdentityHandlerStubForValue(value); + } else { + LoggerFactory.getLogger(this.getClass()).debug("Field [{0}] has no setter skipping", fieldEntry); + } + } + } + + /** + * Instructs SetterTester to skip the field when running pojoClass + * validation. + * + * @param fieldToBeSkipped + * Field name (e.g. Into Person class, to skip getName, provide + * "name" as a field to be skipped. + */ + public void addField(String fieldToBeSkipped) { + if (fieldToBeSkipped == null || fieldToBeSkipped.trim().isEmpty()) { + throw new IllegalArgumentException("The argument 'fieldToBeSkipped' cannot be null or empty."); + } - Affirm.affirmEquals("Setter test failed, non equal value for field=[" + fieldEntry + "]", value, - fieldEntry.get(classInstance)); - - IdentityHandlerStub.unregisterIdentityHandlerStubForValue(value); - } else { - LoggerFactory.getLogger(this.getClass()).debug("Field [{0}] has no setter skipping", fieldEntry); - } - } - } - - /** - * Instructs SetterTester to skip the field when running pojoClass - * validation. - * - * @param fieldToBeSkipped - * Field name (e.g. Into Person class, to skip setName, provide - * "name" as a field to be skipped. - */ - public void addField(String fieldToBeSkipped) { - if (fieldToBeSkipped == null || fieldToBeSkipped.trim().isEmpty()) { - throw new IllegalArgumentException("The argument 'fieldToBeSkipped' cannot be null or empty."); - } - - this.skippedFields.add(fieldToBeSkipped); - } -} + this.skippedFields.add(fieldToBeSkipped); + } +} \ No newline at end of file