JValidator implements Validator { @Override public void validate(String methodName, Class<?>[] parameterTypes, Object[] arguments) throws Exception { List<Class<?>> groups = new ArrayList<>(); Class<?> methodClass = methodClass(methodName); if (methodClass != null) { groups.add(methodClass); } Set<ConstraintViolation<?>> violations = new HashSet<>(); Method method = clazz.getMethod(methodName, parameterTypes); Class<?>[] methodClasses; if (method.isAnnotationPresent(MethodValidated.class)){ methodClasses = method.getAnnotation(MethodValidated.class).value(); groups.addAll(Arrays.asList(methodClasses)); } groups.add(0, Default.class); groups.add(1, clazz); Class<?>[] classgroups = groups.toArray(new Class[groups.size()]); Object parameterBean = getMethodParameterBean(clazz, method, arguments); if (parameterBean != null) { violations.addAll(validator.validate(parameterBean, classgroups )); } for (Object arg : arguments) { validate(violations, arg, classgroups); } if (!violations.isEmpty()) { logger.error("Failed to validate service: " + clazz.getName() + ", method: " + methodName + ", cause: " + violations); throw new ConstraintViolationException("Failed to validate service: " + clazz.getName() + ", method: " + methodName + ", cause: " + violations, violations); } } @SuppressWarnings({"unchecked", "rawtypes"})  JValidator(URL url); @Override void validate(String methodName, Class<?>[] parameterTypes, Object[] arguments);  }
@Test public void testItWithNonExistMethod() throws Exception { Assertions.assertThrows(NoSuchMethodException.class, () -> { URL url = URL.valueOf("test: JValidator jValidator = new JValidator(url); jValidator.validate("nonExistingMethod", new Class<?>[]{String.class}, new Object[]{"arg1"}); }); }
@Test public void testItWithExistMethod() throws Exception { URL url = URL.valueOf("test: JValidator jValidator = new JValidator(url); jValidator.validate("someMethod1", new Class<?>[]{String.class}, new Object[]{"anything"}); }
@Test public void testItWhenItViolatedConstraint() throws Exception { Assertions.assertThrows(ConstraintViolationException.class, () -> { URL url = URL.valueOf("test: JValidator jValidator = new JValidator(url); jValidator.validate("someMethod2", new Class<?>[]{ValidationParameter.class}, new Object[]{new ValidationParameter()}); }); }
@Test public void testItWhenItMeetsConstraint() throws Exception { URL url = URL.valueOf("test: JValidator jValidator = new JValidator(url); jValidator.validate("someMethod2", new Class<?>[]{ValidationParameter.class}, new Object[]{new ValidationParameter("NotBeNull")}); }
@Test public void testItWithArrayArg() throws Exception { URL url = URL.valueOf("test: JValidator jValidator = new JValidator(url); jValidator.validate("someMethod3", new Class<?>[]{ValidationParameter[].class}, new Object[]{new ValidationParameter[]{new ValidationParameter("parameter")}}); }
@Test public void testItWithCollectionArg() throws Exception { URL url = URL.valueOf("test: JValidator jValidator = new JValidator(url); jValidator.validate("someMethod4", new Class<?>[]{List.class}, new Object[]{Arrays.asList("parameter")}); }
@Test public void testItWithMapArg() throws Exception { URL url = URL.valueOf("test: JValidator jValidator = new JValidator(url); Map<String, String> map = new HashMap<>(); map.put("key", "value"); jValidator.validate("someMethod5", new Class<?>[]{Map.class}, new Object[]{map}); }