From 11fae395040e4f6517f2db59b809b6720962c9fe Mon Sep 17 00:00:00 2001 From: jensp Date: Fri, 29 May 2015 18:19:45 +0000 Subject: [PATCH] CCM NG: Test for checking toString implementations for null safety git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@3441 8810af33-2d31-482b-a856-94f89814c4df --- .../java/org/libreccm/core/EmailAddress.java | 2 +- .../org/libreccm/core/GroupMembership.java | 13 ++-- .../libreccm/core/CcmCoreEntitiesTest.java | 2 +- .../org/libreccm/core/EntitiesTestCore.java | 66 ++++++++++++++++--- 4 files changed, 65 insertions(+), 18 deletions(-) diff --git a/ccm-core/src/main/java/org/libreccm/core/EmailAddress.java b/ccm-core/src/main/java/org/libreccm/core/EmailAddress.java index 70b9573cb..3b12e534c 100644 --- a/ccm-core/src/main/java/org/libreccm/core/EmailAddress.java +++ b/ccm-core/src/main/java/org/libreccm/core/EmailAddress.java @@ -86,7 +86,7 @@ public class EmailAddress implements Serializable { if (obj == null) { return false; } - if (getClass() != obj.getClass()) { + if (!(obj instanceof EmailAddress)) { return false; } final EmailAddress other = (EmailAddress) obj; diff --git a/ccm-core/src/main/java/org/libreccm/core/GroupMembership.java b/ccm-core/src/main/java/org/libreccm/core/GroupMembership.java index 44d23f1e0..221946c0c 100644 --- a/ccm-core/src/main/java/org/libreccm/core/GroupMembership.java +++ b/ccm-core/src/main/java/org/libreccm/core/GroupMembership.java @@ -77,7 +77,7 @@ public class GroupMembership implements Serializable { public int hashCode() { int hash = 3; hash = 37 * hash - + (int) (this.membershipId ^ (this.membershipId >>> 32)); + + (int) (this.membershipId ^ (this.membershipId >>> 32)); hash = 37 * hash + Objects.hashCode(this.group); hash = 37 * hash + Objects.hashCode(this.user); return hash; @@ -112,11 +112,12 @@ public class GroupMembership implements Serializable { @Override public String toString() { return String.format("%s{ " - + "membershipId = %d, " - + "user = %s, " - + "group = %s, " - + " }," - + super.toString(), + + "membershipId = %d, " + + "user = %s, " + + "group = %s, " + + " },", + super.toString(), + membershipId, Objects.toString(user), Objects.toString(group)); } diff --git a/ccm-core/src/test/java/org/libreccm/core/CcmCoreEntitiesTest.java b/ccm-core/src/test/java/org/libreccm/core/CcmCoreEntitiesTest.java index c72eb6948..0c49cff25 100644 --- a/ccm-core/src/test/java/org/libreccm/core/CcmCoreEntitiesTest.java +++ b/ccm-core/src/test/java/org/libreccm/core/CcmCoreEntitiesTest.java @@ -23,7 +23,7 @@ import org.libreccm.tests.categories.UnitTest; @Category(UnitTest.class) public class CcmCoreEntitiesTest extends EntitiesTestCore { - @Parameterized.Parameters + @Parameterized.Parameters(name = "{0}") public static Collection> data() { return Arrays.asList(new Class[]{ CcmObject.class, diff --git a/ccm-core/src/test/java/org/libreccm/core/EntitiesTestCore.java b/ccm-core/src/test/java/org/libreccm/core/EntitiesTestCore.java index deb85d2ac..5c56785e3 100644 --- a/ccm-core/src/test/java/org/libreccm/core/EntitiesTestCore.java +++ b/ccm-core/src/test/java/org/libreccm/core/EntitiesTestCore.java @@ -7,8 +7,20 @@ package org.libreccm.core; import nl.jqno.equalsverifier.EqualsVerifier; import nl.jqno.equalsverifier.Warning; +import org.junit.Assert; import org.junit.Test; +import java.beans.BeanInfo; +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; + /** * * @author Jens Pelzetter @@ -24,15 +36,49 @@ public class EntitiesTestCore { @Test public void verifyEqualsAndHashCode() { EqualsVerifier - .forClass(entityClass) - .suppress(Warning.STRICT_INHERITANCE) - .withRedefinedSuperclass() - .verify(); + .forClass(entityClass) + .suppress(Warning.STRICT_INHERITANCE) + .withRedefinedSuperclass() + .verify(); } -// -// @Test -// public void verifyToString() { -// -// } - + + @Test + public void verifyToString() throws IntrospectionException, + InstantiationException, + IllegalAccessException, + IllegalArgumentException, + InvocationTargetException { + final Object obj = entityClass.newInstance(); +// final BeanInfo beanInfo = Introspector.getBeanInfo(entityClass); +// +// final PropertyDescriptor[] properties = beanInfo +// .getPropertyDescriptors(); +// for (PropertyDescriptor property : properties) { +// final Method setter = property.getWriteMethod(); + +// setter.invoke(obj, new Object[]{null}); + final Field[] fields = entityClass.getDeclaredFields(); + for (Field field : fields) { + if (!Modifier.isStatic(field.getModifiers()) + && !field.getType().isPrimitive()) { + field.setAccessible(true); + field.set(obj, null); + } + } + + try { + obj.toString(); + } catch (NullPointerException ex) { + final StringWriter strWriter = new StringWriter(); + final PrintWriter writer = new PrintWriter(strWriter); + ex.printStackTrace(writer); + Assert.fail(String.format( + "toString() implemention of class \"%s\" " + + "is not null safe:\n %s", + entityClass.getName(), + strWriter.toString())); + + } + } + }