Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

5619 Refactoring Unit Tests with Parameterized Class #5636

Merged
merged 6 commits into from Mar 13, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 4 additions & 0 deletions doc/sphinx-guides/source/developers/testing.rst
Expand Up @@ -60,6 +60,10 @@ Refactoring Code to Make It Unit-Testable

Existing code is not necessarily written in a way that lends itself to easy testing. Generally speaking, it is difficult to write unit tests for both JSF "backing" beans (which end in ``Page.java``) and "service" beans (which end in ``Service.java``) because they require the database to be running in order to test them. If service beans can be exercised via API they can be tested with integration tests (described below) but a good technique for making the logic testable it to move code to "util beans" (which end in ``Util.java``) that operate on Plain Old Java Objects (POJOs). ``PrivateUrlUtil.java`` is a good example of moving logic from ``PrivateUrlServiceBean.java`` to a "util" bean to make the code testable.

Parameterized Tests and JUnit Theories
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Often times you will want to test a method multiple times with similar values. In order to avoid test bloat (writing a test for every data combination), JUnit offers Data-driven unit tests with ``Parameterized.class`` and ``Theories.class``. This allows a test to be run for each set of defined data values. For reference, take a look at issue https://github.com/IQSS/dataverse/issues/5619 .

Observing Changes to Code Coverage
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Expand Down
@@ -1,40 +1,61 @@
package edu.harvard.iq.dataverse.confirmemail;

import java.sql.Timestamp;
import java.util.Collection;
import java.util.Arrays;

import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.experimental.runners.Enclosed;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Enclosed.class)
public class ConfirmEmailUtilTest {

@Test
public void testFriendlyExpirationTime() {
System.out.println("Friendly expiration timestamp / measurement test");
System.out.println("1440 Minutes: " + ConfirmEmailUtil.friendlyExpirationTime(1440));
assertEquals("24 hours", ConfirmEmailUtil.friendlyExpirationTime(1440));
System.out.println("60 Minutes: " + ConfirmEmailUtil.friendlyExpirationTime(60));
assertEquals("1 hour", ConfirmEmailUtil.friendlyExpirationTime(60));
System.out.println("30 Minutes: " + ConfirmEmailUtil.friendlyExpirationTime(30));
assertEquals("30 minutes", ConfirmEmailUtil.friendlyExpirationTime(30));
System.out.println("90 Minutes: " + ConfirmEmailUtil.friendlyExpirationTime(90));
assertEquals("1.5 hours", ConfirmEmailUtil.friendlyExpirationTime(90));
System.out.println("2880 minutes: " + ConfirmEmailUtil.friendlyExpirationTime(2880));
assertEquals("48 hours", ConfirmEmailUtil.friendlyExpirationTime(2880));
System.out.println("150 minutes: " + ConfirmEmailUtil.friendlyExpirationTime(150));
assertEquals("2.5 hours", ConfirmEmailUtil.friendlyExpirationTime(150));
System.out.println("165 minutes: " + ConfirmEmailUtil.friendlyExpirationTime(165));
assertEquals("2.75 hours", ConfirmEmailUtil.friendlyExpirationTime(165));
System.out.println("1 Minute: " + ConfirmEmailUtil.friendlyExpirationTime(1));
assertEquals("1 minute", ConfirmEmailUtil.friendlyExpirationTime(1));
System.out.println();
}
@RunWith(Parameterized.class)
public static class ConfirmEmailUtilParamTest {

public String timeAsFriendlyString;
public int timeInMinutes;

public ConfirmEmailUtilParamTest(String timeAsFriendlyString, int timeInSeconds) {
this.timeAsFriendlyString = timeAsFriendlyString;
this.timeInMinutes = timeInSeconds;
}

@Test
public void testGrandfatheredTime() {
System.out.println();
System.out.println("Grandfathered account timestamp test");
System.out.println("Grandfathered Time (y2k): " + ConfirmEmailUtil.getGrandfatheredTime());
assertEquals(Timestamp.valueOf("2000-01-01 00:00:00.0"), ConfirmEmailUtil.getGrandfatheredTime());
System.out.println();
@Parameters
public static Collection<Object[]> parameters() {
return Arrays.asList(
new Object[][] {
{ "48 hours", 2880 },
{ "24 hours", 1440 },
{ "2.75 hours", 165 },
{ "2.5 hours", 150 },
{ "1.5 hours", 90 },
{ "1 hour", 60 },
{ "30 minutes", 30 },
{ "1 minute", 1 }
}
);
}

@Test
public void friendlyExpirationTimeTest() {
assertEquals(timeAsFriendlyString, ConfirmEmailUtil.friendlyExpirationTime(timeInMinutes));
}
}

public static class ConfirmEmailUtilNoParamTest {

@Test
public void testGrandfatheredTime() {
System.out.println();
System.out.println("Grandfathered account timestamp test");
System.out.println("Grandfathered Time (y2k): " + ConfirmEmailUtil.getGrandfatheredTime());
assertEquals(Timestamp.valueOf("2000-01-01 00:00:00.0"), ConfirmEmailUtil.getGrandfatheredTime());
System.out.println();
}
}
}
42 changes: 32 additions & 10 deletions src/test/java/edu/harvard/iq/dataverse/util/JsfHelperTest.java
Expand Up @@ -4,24 +4,29 @@

package edu.harvard.iq.dataverse.util;

import static org.junit.Assert.assertEquals;

import java.util.Arrays;
import java.util.Collection;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

/**
*
* @author michael
*/
@RunWith(Parameterized.class)
public class JsfHelperTest {

enum TestEnum { Lorem, Ipsum, Dolor, Sit, Amet }

public JsfHelperTest() {
}

@BeforeClass
public static void setUpClass() {
}
Expand All @@ -38,6 +43,27 @@ public void setUp() {
public void tearDown() {
}

public TestEnum inputEnum;
public String inputString;
public TestEnum defaultEnumValue;

public JsfHelperTest(TestEnum inputEnum, String inputString, TestEnum defaultEnumValue) {
this.inputEnum = inputEnum;
this.inputString = inputString;
this.defaultEnumValue = defaultEnumValue;
}

@Parameters
public static Collection<Object[]> parameters() {
return Arrays.asList (
new Object[][] {
{ TestEnum.Lorem, "Lorem", TestEnum.Dolor },
{ TestEnum.Lorem, "Lorem ", TestEnum.Dolor },
{ TestEnum.Dolor, null, TestEnum.Dolor },
{ TestEnum.Dolor, "THIS IS A BAD VALUE", TestEnum.Dolor },
}
);
}

/**
* Test of enumValue method, of class JsfHelper.
Expand All @@ -46,12 +72,8 @@ public void tearDown() {
public void testEnumValue() {
System.out.println("enumValue");
JsfHelper instance = new JsfHelper();

assertEquals( TestEnum.Lorem, instance.enumValue("Lorem", TestEnum.class, TestEnum.Dolor) );
assertEquals( TestEnum.Lorem, instance.enumValue("Lorem ", TestEnum.class, TestEnum.Dolor) );
assertEquals( TestEnum.Dolor, instance.enumValue(null, TestEnum.class, TestEnum.Dolor) );
assertEquals( TestEnum.Dolor, instance.enumValue("THIS IS A BAD VALUE", TestEnum.class, TestEnum.Dolor) );


assertEquals( inputEnum, instance.enumValue(inputString, TestEnum.class, defaultEnumValue) );
}

}