public void testValidate() throws Exception { /* MockAction.class */ // reference number ValueStack stack = container.getInstance(ValueStackFactory.class).createValueStack(); final RequiredStringValidator referenceNumberRequiredStringValidator = new RequiredStringValidator(); referenceNumberRequiredStringValidator.setFieldName("referenceNumber"); referenceNumberRequiredStringValidator.setDefaultMessage("Reference number is required"); referenceNumberRequiredStringValidator.setValueStack(stack); // order final RequiredFieldValidator orderRequiredValidator = new RequiredFieldValidator(); orderRequiredValidator.setFieldName("order"); orderRequiredValidator.setDefaultMessage("Order is required"); orderRequiredValidator.setValueStack(stack); // customer final RequiredFieldValidator customerRequiredValidator = new RequiredFieldValidator(); customerRequiredValidator.setFieldName("customer"); customerRequiredValidator.setDefaultMessage("Customer is required"); customerRequiredValidator.setValueStack(stack); final VisitorFieldValidator customerVisitorValidator = new VisitorFieldValidator(); customerVisitorValidator.setAppendPrefix(true); customerVisitorValidator.setFieldName("customer"); customerVisitorValidator.setValueStack(stack); /* Customer.class */ // customer -> name final RequiredStringValidator customerNameRequiredStringValidator = new RequiredStringValidator(); customerNameRequiredStringValidator.setFieldName("name"); customerNameRequiredStringValidator.setDefaultMessage("Name is required"); customerNameRequiredStringValidator.setValueStack(stack); // customer -> age final RequiredFieldValidator customerAgeRequiredValidator = new RequiredFieldValidator(); customerAgeRequiredValidator.setFieldName("age"); customerAgeRequiredValidator.setDefaultMessage("Age is required"); customerAgeRequiredValidator.setValueStack(stack); // customer -> Address final RequiredFieldValidator customerAddressRequiredFieldValidator = new RequiredFieldValidator(); customerAddressRequiredFieldValidator.setFieldName("address"); customerAddressRequiredFieldValidator.setDefaultMessage("Address is required"); customerAddressRequiredFieldValidator.setValueStack(stack); final VisitorFieldValidator customerAddressVisitorFieldValidator = new VisitorFieldValidator(); customerAddressVisitorFieldValidator.setFieldName("address"); customerAddressVisitorFieldValidator.setAppendPrefix(true); // customerAddressVisitorFieldValidator.setDefaultMessage(""); customerAddressVisitorFieldValidator.setValueStack(stack); /* Address.class */ // customer -> Address -> street final RequiredStringValidator customerAddressStreetRequiredFieldValidator = new RequiredStringValidator(); customerAddressStreetRequiredFieldValidator.setFieldName("street"); customerAddressStreetRequiredFieldValidator.setDefaultMessage("Street is required"); customerAddressStreetRequiredFieldValidator.setShortCircuit(true); customerAddressStreetRequiredFieldValidator.setValueStack(stack); final RequiredStringValidator customerAddressStreetRequiredFieldValidator2 = new RequiredStringValidator(); customerAddressStreetRequiredFieldValidator2.setFieldName("street"); customerAddressStreetRequiredFieldValidator2.setDefaultMessage("Street is required 2"); customerAddressStreetRequiredFieldValidator2.setShortCircuit(true); customerAddressStreetRequiredFieldValidator2.setValueStack(stack); // customer -> Address -> pobox final RequiredStringValidator customerAddressPoboxRequiredFieldValidator = new RequiredStringValidator(); customerAddressPoboxRequiredFieldValidator.setFieldName("pobox"); customerAddressPoboxRequiredFieldValidator.setDefaultMessage("PO Box is required"); customerAddressPoboxRequiredFieldValidator.setShortCircuit(false); customerAddressPoboxRequiredFieldValidator.setValueStack(stack); final RequiredStringValidator customerAddressPoboxRequiredFieldValidator2 = new RequiredStringValidator(); customerAddressPoboxRequiredFieldValidator2.setFieldName("pobox"); customerAddressPoboxRequiredFieldValidator2.setDefaultMessage("PO Box is required 2"); customerAddressPoboxRequiredFieldValidator2.setShortCircuit(false); customerAddressPoboxRequiredFieldValidator2.setValueStack(stack); final List<Validator> validatorsForMockAction = new ArrayList<Validator>() { { add(referenceNumberRequiredStringValidator); add(orderRequiredValidator); add(customerRequiredValidator); add(customerVisitorValidator); } }; final List<Validator> validatorsForCustomer = new ArrayList<Validator>() { { add(customerNameRequiredStringValidator); add(customerAgeRequiredValidator); add(customerAddressRequiredFieldValidator); add(customerAddressVisitorFieldValidator); } }; final List<Validator> validatorsForAddress = new ArrayList<Validator>() { { add(customerAddressStreetRequiredFieldValidator); add(customerAddressStreetRequiredFieldValidator2); add(customerAddressPoboxRequiredFieldValidator); add(customerAddressPoboxRequiredFieldValidator2); } }; DefaultActionValidatorManager validatorManager = new DefaultActionValidatorManager() { @Override public List<Validator> getValidators(Class clazz, String context, String method) { if (clazz.isAssignableFrom(MockAction.class)) { return validatorsForMockAction; } else if (clazz.isAssignableFrom(Customer.class)) { return validatorsForCustomer; } else if (clazz.isAssignableFrom(Address.class)) { return validatorsForAddress; } return Collections.emptyList(); } }; customerVisitorValidator.setActionValidatorManager(validatorManager); customerAddressVisitorFieldValidator.setActionValidatorManager(validatorManager); MockAction action = new MockAction(); stack.push(action); validatorManager.validate(action, "ctx"); assertFalse(action.hasActionErrors()); assertFalse(action.hasActionMessages()); assertTrue(action.hasFieldErrors()); assertTrue(action.getFieldErrors().containsKey("referenceNumber")); assertEquals((action.getFieldErrors().get("referenceNumber")).size(), 1); assertTrue(action.getFieldErrors().containsKey("order")); assertEquals((action.getFieldErrors().get("order")).size(), 1); assertTrue(action.getFieldErrors().containsKey("customer.name")); assertEquals((action.getFieldErrors().get("customer.name")).size(), 1); assertTrue(action.getFieldErrors().containsKey("customer.age")); assertEquals((action.getFieldErrors().get("customer.age")).size(), 1); assertTrue(action.getFieldErrors().containsKey("customer.address.street")); assertEquals((action.getFieldErrors().get("customer.address.street")).size(), 1); assertTrue(action.getFieldErrors().containsKey("customer.address.pobox")); assertEquals((action.getFieldErrors().get("customer.address.pobox")).size(), 2); }