From 03db4f1ab06c200b0478b069214d7579a08a3ef0 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Fri, 7 Jun 2024 08:33:08 +0200 Subject: [PATCH] WW-5250 Addresses TODO in test and stops using Mock Objects --- .../validator/ActionValidatorManager.java | 4 +- .../DefaultActionValidatorManager.java | 18 +- .../DefaultActionValidatorManagerTest.java | 358 +++++++++--------- 3 files changed, 187 insertions(+), 193 deletions(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/validator/ActionValidatorManager.java b/core/src/main/java/com/opensymphony/xwork2/validator/ActionValidatorManager.java index d78224b264..ea0de3a724 100644 --- a/core/src/main/java/com/opensymphony/xwork2/validator/ActionValidatorManager.java +++ b/core/src/main/java/com/opensymphony/xwork2/validator/ActionValidatorManager.java @@ -36,7 +36,7 @@ public interface ActionValidatorManager { * @param method the name of the method being invoked on the action - can be null. * @return a list of all validators for the given class and context. */ - List getValidators(Class clazz, String context, String method); + List getValidators(Class clazz, String context, String method); /** * Returns a list of validators for the given class and context. This is the primary @@ -46,7 +46,7 @@ public interface ActionValidatorManager { * @param context the context of the action class - can be null. * @return a list of all validators for the given class and context. */ - List getValidators(Class clazz, String context); + List getValidators(Class clazz, String context); /** * Validates the given object using action and its context. diff --git a/core/src/main/java/com/opensymphony/xwork2/validator/DefaultActionValidatorManager.java b/core/src/main/java/com/opensymphony/xwork2/validator/DefaultActionValidatorManager.java index 3af54669ef..f05b804860 100644 --- a/core/src/main/java/com/opensymphony/xwork2/validator/DefaultActionValidatorManager.java +++ b/core/src/main/java/com/opensymphony/xwork2/validator/DefaultActionValidatorManager.java @@ -125,7 +125,7 @@ public void validate(Object object, String context, ValidatorContext validatorCo * @param context context * @return a validator key which is the class name plus context. */ - protected String buildValidatorKey(Class clazz, String context) { + protected String buildValidatorKey(Class clazz, String context) { return clazz.getName() + "/" + context; } @@ -137,7 +137,7 @@ protected Validator getValidatorFromValidatorConfig(ValidatorConfig config, Valu } @Override - public synchronized List getValidators(Class clazz, String context, String method) { + public synchronized List getValidators(Class clazz, String context, String method) { String validatorKey = buildValidatorKey(clazz, context); if (!validatorCache.containsKey(validatorKey)) { @@ -158,7 +158,7 @@ public synchronized List getValidators(Class clazz, String context, S } @Override - public synchronized List getValidators(Class clazz, String context) { + public synchronized List getValidators(Class clazz, String context) { return getValidators(clazz, context, null); } @@ -277,7 +277,7 @@ public void validate(Object object, String context, ValidatorContext validatorCo * @param checked the set of previously checked class-contexts, null if none have been checked * @return a list of validator configs for the given class and context. */ - protected List buildValidatorConfigs(Class clazz, String context, boolean checkFile, Set checked) { + protected List buildValidatorConfigs(Class clazz, String context, boolean checkFile, Set checked) { List validatorConfigs = new ArrayList<>(); if (checked == null) { @@ -287,7 +287,7 @@ protected List buildValidatorConfigs(Class clazz, String contex } if (clazz.isInterface()) { - for (Class anInterface : clazz.getInterfaces()) { + for (Class anInterface : clazz.getInterfaces()) { validatorConfigs.addAll(buildValidatorConfigs(anInterface, context, checkFile, checked)); } } else { @@ -297,7 +297,7 @@ protected List buildValidatorConfigs(Class clazz, String contex } // look for validators for implemented interfaces - for (Class anInterface1 : clazz.getInterfaces()) { + for (Class anInterface1 : clazz.getInterfaces()) { if (checked.contains(anInterface1.getName())) { continue; } @@ -317,17 +317,17 @@ protected List buildValidatorConfigs(Class clazz, String contex return validatorConfigs; } - protected List buildAliasValidatorConfigs(Class aClass, String context, boolean checkFile) { + protected List buildAliasValidatorConfigs(Class aClass, String context, boolean checkFile) { String fileName = aClass.getName().replace('.', '/') + "-" + context + VALIDATION_CONFIG_SUFFIX; return loadFile(fileName, aClass, checkFile); } - protected List buildClassValidatorConfigs(Class aClass, boolean checkFile) { + protected List buildClassValidatorConfigs(Class aClass, boolean checkFile) { String fileName = aClass.getName().replace('.', '/') + VALIDATION_CONFIG_SUFFIX; return loadFile(fileName, aClass, checkFile); } - protected List loadFile(String fileName, Class clazz, boolean checkFile) { + protected List loadFile(String fileName, Class clazz, boolean checkFile) { List retList = Collections.emptyList(); URL fileUrl = ClassLoaderUtil.getResource(fileName, clazz); diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/DefaultActionValidatorManagerTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/DefaultActionValidatorManagerTest.java index c6f4b3d6f2..5014a374f7 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/DefaultActionValidatorManagerTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/DefaultActionValidatorManagerTest.java @@ -18,161 +18,167 @@ */ package com.opensymphony.xwork2.validator; -import com.mockobjects.dynamic.C; -import com.mockobjects.dynamic.Mock; -import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.FileManagerFactory; import com.opensymphony.xwork2.SimpleAction; -import com.opensymphony.xwork2.StubValueStack; import com.opensymphony.xwork2.TestBean; +import com.opensymphony.xwork2.ValidationOrderAction; import com.opensymphony.xwork2.XWorkTestCase; -import com.opensymphony.xwork2.config.ConfigurationException; +import com.opensymphony.xwork2.interceptor.ValidationAware; import com.opensymphony.xwork2.test.DataAware2; -import com.opensymphony.xwork2.test.SimpleAction2; import com.opensymphony.xwork2.test.SimpleAction3; -import com.opensymphony.xwork2.util.ValueStack; -import com.opensymphony.xwork2.util.fs.DefaultFileManager; -import com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory; +import com.opensymphony.xwork2.test.User; +import com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator; +import com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator; +import com.opensymphony.xwork2.validator.validators.ExpressionValidator; +import com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator; +import com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator; +import com.opensymphony.xwork2.validator.validators.RequiredFieldValidator; +import com.opensymphony.xwork2.validator.validators.RequiredStringValidator; +import com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator; import org.apache.struts2.StrutsException; +import org.xml.sax.SAXParseException; import java.util.ArrayList; -import java.util.HashMap; +import java.util.Iterator; import java.util.List; +import java.util.Map; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; -/** - * DefaultActionValidatorManagerTest - * - * @author Jason Carreira - * @author tm_jee - * @version $Date$ $Id$ - */ public class DefaultActionValidatorManagerTest extends XWorkTestCase { protected final String alias = "validationAlias"; DefaultActionValidatorManager actionValidatorManager; - Mock mockValidatorFileParser; - Mock mockValidatorFactory; - ValueStack stubValueStack; @Override protected void setUp() throws Exception { - actionValidatorManager = new DefaultActionValidatorManager(); super.setUp(); - mockValidatorFileParser = new Mock(ValidatorFileParser.class); - actionValidatorManager.setValidatorFileParser((ValidatorFileParser)mockValidatorFileParser.proxy()); - - mockValidatorFactory = new Mock(ValidatorFactory.class); - actionValidatorManager.setValidatorFactory((ValidatorFactory)mockValidatorFactory.proxy()); - - stubValueStack = new StubValueStack(); - ActionContext.of() - .withValueStack(stubValueStack) - .bind(); - - DefaultFileManagerFactory factory = new DefaultFileManagerFactory(); - factory.setContainer(container); - factory.setFileManager(new DefaultFileManager()); - actionValidatorManager.setFileManagerFactory(factory); + actionValidatorManager = container.inject(DefaultActionValidatorManager.class); } @Override protected void tearDown() throws Exception { - actionValidatorManager = null; super.tearDown(); - mockValidatorFactory = null; - mockValidatorFileParser = null; + actionValidatorManager = null; } - public void testBuildValidatorKey() { String validatorKey = actionValidatorManager.buildValidatorKey(SimpleAction.class, alias); assertEquals(SimpleAction.class.getName() + "/" + alias, validatorKey); } public void testBuildsValidatorsForAlias() { - mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs", - C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/SimpleAction-validation.xml")), - new ArrayList()); - mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs", - C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/SimpleAction-validationAlias-validation.xml")), - new ArrayList()); - actionValidatorManager.getValidators(SimpleAction.class, alias); - mockValidatorFileParser.verify(); + List validators = actionValidatorManager.getValidators(SimpleAction.class, alias); + + assertThat(validators).hasSize(11).map(Validator::getClass).containsExactly( + ExpressionValidator.class, + RequiredFieldValidator.class, + IntRangeFieldValidator.class, + DoubleRangeFieldValidator.class, + DateRangeFieldValidator.class, + IntRangeFieldValidator.class, + IntRangeFieldValidator.class, + LongRangeFieldValidator.class, + ShortRangeFieldValidator.class, + RequiredFieldValidator.class, + IntRangeFieldValidator.class + ); + assertThat(validators).hasSize(11).map(Validator::getDefaultMessage).containsExactly( + "Foo must be greater than Bar. Foo = ${foo}, Bar = ${bar}.", + "You must enter a value for bar.", + "bar must be between ${min} and ${max}, current value is ${bar}.", + "percentage must be between ${minExclusive} and ${maxExclusive}, current value is ${percentage}.", + "The date must be between 12-22-2002 and 12-25-2002.", + "Could not find foo.range!", + "Could not find baz.range!", + "Could not find foo.range!", + "Could not find foo.range!", + "You must enter a value for baz.", + "baz out of range." + ); } public void testBuildsValidatorsForAliasError() { - boolean pass = false; - try { - mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs", - C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/TestBean-validation.xml")), - new ArrayList()); - mockValidatorFileParser.expectAndThrow("parseActionValidatorConfigs", - C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/TestBean-badtest-validation.xml")), - new ConfigurationException()); - List validatorList = actionValidatorManager.getValidators(TestBean.class, "badtest"); - } catch (StrutsException ex) { - pass = true; - } - mockValidatorFileParser.verify(); - assertTrue("Didn't throw exception on load failure", pass); + assertThatThrownBy(() -> actionValidatorManager.getValidators(TestBean.class, "badtest")) + .isInstanceOf(StrutsException.class) + .hasCause(new SAXParseException("Attribute \"foo\" must be declared for element type \"field-validator\".", null)); } public void testGetValidatorsForInterface() { - mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs", - C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/test/DataAware-validation.xml")), - new ArrayList()); - mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs", - C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/test/DataAware-validationAlias-validation.xml")), - new ArrayList()); - mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs", - C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/test/DataAware2-validation.xml")), - new ArrayList()); - actionValidatorManager.getValidators(DataAware2.class, alias); - mockValidatorFileParser.verify(); + List validators = actionValidatorManager.getValidators(DataAware2.class, alias); + + assertThat(validators).hasSize(3).map(Validator::getClass).containsExactly( + RequiredFieldValidator.class, + RequiredStringValidator.class, + RequiredStringValidator.class + ); + assertThat(validators).hasSize(3).map(Validator::getValidatorType).containsExactly( + "required", + "requiredstring", + "requiredstring" + ); + assertThat(validators).hasSize(3).map(Validator::getDefaultMessage).containsExactly( + "You must enter a value for data.", + "You must enter a value for data.", + "You must enter a value for data." + ); } public void testGetValidatorsFromInterface() { - mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs", - C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/SimpleAction-validation.xml")), - new ArrayList()); - mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs", - C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/SimpleAction-validationAlias-validation.xml")), - new ArrayList()); - mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs", - C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/test/DataAware-validation.xml")), - new ArrayList()); - mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs", - C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/test/DataAware-validationAlias-validation.xml")), - new ArrayList()); - actionValidatorManager.getValidators(SimpleAction3.class, alias); - mockValidatorFileParser.verify(); - } - - public void testSameAliasWithDifferentClass() { - mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs", - C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/SimpleAction-validation.xml")), - new ArrayList()); - mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs", - C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/SimpleAction-validationAlias-validation.xml")), - new ArrayList()); - mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs", - C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/test/SimpleAction2-validation.xml")), - new ArrayList()); - mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs", - C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/test/SimpleAction2-validationAlias-validation.xml")), - new ArrayList()); - actionValidatorManager.getValidators(SimpleAction.class, alias); - actionValidatorManager.getValidators(SimpleAction2.class, alias); - mockValidatorFileParser.verify(); + List validators = actionValidatorManager.getValidators(SimpleAction3.class, alias); + + assertThat(validators).hasSize(13).map(Validator::getClass).containsExactly( + ExpressionValidator.class, + RequiredFieldValidator.class, + IntRangeFieldValidator.class, + DoubleRangeFieldValidator.class, + DateRangeFieldValidator.class, + IntRangeFieldValidator.class, + IntRangeFieldValidator.class, + LongRangeFieldValidator.class, + ShortRangeFieldValidator.class, + RequiredFieldValidator.class, + IntRangeFieldValidator.class, + RequiredFieldValidator.class, + RequiredStringValidator.class + ); + assertThat(validators).hasSize(13).map(Validator::getValidatorType).containsExactly( + "expression", + "required", + "int", + "double", + "date", + "int", + "int", + "long", + "short", + "required", + "int", + "required", + "requiredstring" + ); + assertThat(validators).hasSize(13).map(Validator::getDefaultMessage).containsExactly( + "Foo must be greater than Bar. Foo = ${foo}, Bar = ${bar}.", + "You must enter a value for bar.", + "bar must be between ${min} and ${max}, current value is ${bar}.", + "percentage must be between ${minExclusive} and ${maxExclusive}, current value is ${percentage}.", + "The date must be between 12-22-2002 and 12-25-2002.", + "Could not find foo.range!", + "Could not find baz.range!", + "Could not find foo.range!", + "Could not find foo.range!", + "You must enter a value for baz.", + "baz out of range.", + "You must enter a value for data.", + "You must enter a value for data." + ); } /** * Test to verify WW-3850. - * - * @since 2.3.5 */ public void testBuildsValidatorsForClassError() { // for this test we need to have a file manager with reloadingConfigs to true @@ -188,12 +194,8 @@ public void testBuildsValidatorsForClassError() { } } - /* - // TODO: this all need to be converted to real unit tests - public void testSkipUserMarkerActionLevelShortCircuit() { - // get validators - List validatorList = actionValidatorManager.getValidators(User.class, null); + List validatorList = actionValidatorManager.getValidators(User.class, null); assertEquals(10, validatorList.size()); try { @@ -202,16 +204,17 @@ public void testSkipUserMarkerActionLevelShortCircuit() { user.setEmail("bad_email"); user.setEmail2("bad_email"); - ValidatorContext context = new GenericValidatorContext(user); + ValidationAware validationAware = new SimpleAction(); + ValidatorContext context = new DelegatingValidatorContext(validationAware, actionValidatorManager.textProviderFactory); actionValidatorManager.validate(user, null, context); assertTrue(context.hasFieldErrors()); // check field errors - List l = (List) context.getFieldErrors().get("email"); + List l = context.getFieldErrors().get("email"); assertNotNull(l); assertEquals(1, l.size()); assertEquals("Not a valid e-mail.", l.get(0)); - l = (List) context.getFieldErrors().get("email2"); + l = context.getFieldErrors().get("email2"); assertNotNull(l); assertEquals(2, l.size()); assertEquals("Not a valid e-mail2.", l.get(0)); @@ -219,19 +222,17 @@ public void testSkipUserMarkerActionLevelShortCircuit() { // check action errors assertTrue(context.hasActionErrors()); - l = (List) context.getActionErrors(); + l = new ArrayList<>(context.getActionErrors()); assertNotNull(l); assertEquals(2, l.size()); // both expression test failed see User-validation.xml assertEquals("Email does not start with mark", l.get(0)); } catch (ValidationException ex) { - ex.printStackTrace(); fail("Validation error: " + ex.getMessage()); } } public void testSkipAllActionLevelShortCircuit2() { - // get validators - List validatorList = actionValidatorManager.getValidators(User.class, null); + List validatorList = actionValidatorManager.getValidators(User.class, null); assertEquals(10, validatorList.size()); try { @@ -244,34 +245,30 @@ public void testSkipAllActionLevelShortCircuit2() { user.setEmail("mark_bad_email_for_field_val@foo.com"); user.setEmail2("mark_bad_email_for_field_val@foo.com"); - ValidatorContext context = new GenericValidatorContext(user); + ValidationAware validationAware = new SimpleAction(); + ValidatorContext context = new DelegatingValidatorContext(validationAware, actionValidatorManager.textProviderFactory); actionValidatorManager.validate(user, null, context); assertTrue(context.hasFieldErrors()); // check field errors // we have an error in this field level, email does not ends with mycompany.com - List l = (List) context.getFieldErrors().get("email"); + List l = context.getFieldErrors().get("email"); assertNotNull(l); assertEquals(1, l.size()); // because email-field-val is short-circuit assertEquals("Email not from the right company.", l.get(0)); - // check action errors - l = (List) context.getActionErrors(); + l = new ArrayList<>(context.getActionErrors()); assertFalse(context.hasActionErrors()); assertEquals(0, l.size()); - - } catch (ValidationException ex) { - ex.printStackTrace(); fail("Validation error: " + ex.getMessage()); } } public void testActionLevelShortCircuit() throws Exception { - - List validatorList = actionValidatorManager.getValidators(User.class, null); + List validatorList = actionValidatorManager.getValidators(User.class, null); assertEquals(10, validatorList.size()); User user = new User(); @@ -280,18 +277,18 @@ public void testActionLevelShortCircuit() throws Exception { user.setEmail("tmjee(at)yahoo.co.uk"); user.setEmail("tm_jee(at)yahoo.co.uk"); - ValidatorContext context = new GenericValidatorContext(user); + ValidationAware validationAware = new SimpleAction(); + ValidatorContext context = new DelegatingValidatorContext(validationAware, actionValidatorManager.textProviderFactory); actionValidatorManager.validate(user, null, context); - // check field level errors + // check field level errors // shouldn't have any because action error prevents validation of anything else - List l = (List) context.getFieldErrors().get("email2"); + List l = context.getFieldErrors().get("email2"); assertNull(l); - // check action errors assertTrue(context.hasActionErrors()); - l = (List) context.getActionErrors(); + l = new ArrayList<>(context.getActionErrors()); assertNotNull(l); // we only get one, because UserMarker-validation.xml action-level validator // already sc it :-) @@ -299,10 +296,8 @@ public void testActionLevelShortCircuit() throws Exception { assertEquals("Email not the same as email2", l.get(0)); } - public void testShortCircuitNoErrors() { - // get validators - List validatorList = actionValidatorManager.getValidators(User.class, null); + List validatorList = actionValidatorManager.getValidators(User.class, null); assertEquals(10, validatorList.size()); try { @@ -311,73 +306,72 @@ public void testShortCircuitNoErrors() { user.setEmail("mark@mycompany.com"); user.setEmail2("mark@mycompany.com"); - ValidatorContext context = new GenericValidatorContext(user); + ValidationAware validationAware = new SimpleAction(); + ValidatorContext context = new DelegatingValidatorContext(validationAware, actionValidatorManager.textProviderFactory); actionValidatorManager.validate(user, null, context); assertFalse(context.hasErrors()); } catch (ValidationException ex) { - ex.printStackTrace(); fail("Validation error: " + ex.getMessage()); } } public void testFieldErrorsOrder() throws Exception { - ValidationOrderAction action = new ValidationOrderAction(); - actionValidatorManager.validate(action, "actionContext"); - Map fieldErrors = action.getFieldErrors(); - Iterator i = fieldErrors.entrySet().iterator(); + ValidationOrderAction action = new ValidationOrderAction(); + actionValidatorManager.validate(action, "actionContext"); + Map> fieldErrors = action.getFieldErrors(); + Iterator>> i = fieldErrors.entrySet().iterator(); - assertNotNull(fieldErrors); - assertEquals(fieldErrors.size(), 12); + assertNotNull(fieldErrors); + assertEquals(fieldErrors.size(), 12); - Map.Entry e = (Map.Entry) i.next(); - assertEquals(e.getKey(), "username"); - assertEquals(((List)e.getValue()).get(0), "username required"); + Map.Entry> e = i.next(); + assertEquals(e.getKey(), "username"); + assertEquals(e.getValue().get(0), "username required"); - e = (Map.Entry) i.next(); - assertEquals(e.getKey(), "password"); - assertEquals(((List)e.getValue()).get(0), "password required"); + e = i.next(); + assertEquals(e.getKey(), "password"); + assertEquals((e.getValue()).get(0), "password required"); - e = (Map.Entry) i.next(); - assertEquals(e.getKey(), "confirmPassword"); - assertEquals(((List)e.getValue()).get(0), "confirm password required"); + e = i.next(); + assertEquals(e.getKey(), "confirmPassword"); + assertEquals((e.getValue()).get(0), "confirm password required"); - e = (Map.Entry) i.next(); - assertEquals(e.getKey(), "firstName"); - assertEquals(((List)e.getValue()).get(0), "first name required"); + e = i.next(); + assertEquals(e.getKey(), "firstName"); + assertEquals((e.getValue()).get(0), "first name required"); - e = (Map.Entry) i.next(); - assertEquals(e.getKey(), "lastName"); - assertEquals(((List)e.getValue()).get(0), "last name required"); + e = i.next(); + assertEquals(e.getKey(), "lastName"); + assertEquals((e.getValue()).get(0), "last name required"); - e = (Map.Entry) i.next(); - assertEquals(e.getKey(), "city"); - assertEquals(((List)e.getValue()).get(0), "city is required"); + e = i.next(); + assertEquals(e.getKey(), "city"); + assertEquals((e.getValue()).get(0), "city is required"); - e = (Map.Entry) i.next(); - assertEquals(e.getKey(), "province"); - assertEquals(((List)e.getValue()).get(0), "province is required"); + e = i.next(); + assertEquals(e.getKey(), "province"); + assertEquals((e.getValue()).get(0), "province is required"); - e = (Map.Entry) i.next(); - assertEquals(e.getKey(), "country"); - assertEquals(((List)e.getValue()).get(0), "country is required"); + e = i.next(); + assertEquals(e.getKey(), "country"); + assertEquals((e.getValue()).get(0), "country is required"); - e = (Map.Entry) i.next(); - assertEquals(e.getKey(), "postalCode"); - assertEquals(((List)e.getValue()).get(0), "postal code is required"); + e = i.next(); + assertEquals(e.getKey(), "postalCode"); + assertEquals((e.getValue()).get(0), "postal code is required"); - e = (Map.Entry) i.next(); - assertEquals(e.getKey(), "email"); - assertEquals(((List)e.getValue()).get(0), "email is required"); + e = i.next(); + assertEquals(e.getKey(), "email"); + assertEquals((e.getValue()).get(0), "email is required"); - e = (Map.Entry) i.next(); - assertEquals(e.getKey(), "website"); - assertEquals(((List)e.getValue()).get(0), "website is required"); - - e = (Map.Entry) i.next(); - assertEquals(e.getKey(), "passwordHint"); - assertEquals(((List)e.getValue()).get(0), "password hint is required"); + e = i.next(); + assertEquals(e.getKey(), "website"); + assertEquals((e.getValue()).get(0), "website is required"); + e = i.next(); + assertEquals(e.getKey(), "passwordHint"); + assertEquals((e.getValue()).get(0), "password hint is required"); } - */ + }