From e7071c329acf98ecf5feb1e645be0a8931455baf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=85=B6=E8=8B=97?= Date: Tue, 3 Mar 2020 17:12:46 +0800 Subject: [PATCH] Add a unit test for getMostSpecificMethod of ClassUtils See gh-24633 --- .../springframework/util/ClassUtilsTests.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/spring-core/src/test/java/org/springframework/util/ClassUtilsTests.java b/spring-core/src/test/java/org/springframework/util/ClassUtilsTests.java index d894f91fb8c..82ab35bf4e9 100644 --- a/spring-core/src/test/java/org/springframework/util/ClassUtilsTests.java +++ b/spring-core/src/test/java/org/springframework/util/ClassUtilsTests.java @@ -391,6 +391,32 @@ class ClassUtilsTests { assertThat(ClassUtils.determineCommonAncestor(String.class, List.class)).isNull(); } + @Test + void getMostSpecificMethod() throws NoSuchMethodException { + Method defaultPrintMethod = ClassUtils.getMethod(MethodsInterface.class, "defaultPrint"); + assertThat(ClassUtils.getMostSpecificMethod(defaultPrintMethod, MethodsInterfaceImplementation.class)).isEqualTo(defaultPrintMethod); + assertThat(ClassUtils.getMostSpecificMethod(defaultPrintMethod, SubMethodsInterfaceImplementation.class)).isEqualTo(defaultPrintMethod); + + Method printMethod = ClassUtils.getMethod(MethodsInterface.class, "print", String.class); + assertThat(ClassUtils.getMostSpecificMethod(printMethod, MethodsInterfaceImplementation.class)).isNotEqualTo(printMethod); + assertThat(ClassUtils.getMostSpecificMethod(printMethod, MethodsInterfaceImplementation.class)) + .isEqualTo(ClassUtils.getMethod(MethodsInterfaceImplementation.class, "print", String.class)); + assertThat(ClassUtils.getMostSpecificMethod(printMethod, SubMethodsInterfaceImplementation.class)) + .isEqualTo(ClassUtils.getMethod(MethodsInterfaceImplementation.class, "print", String.class)); + + Method protectedPrintMethod = MethodsInterfaceImplementation.class.getDeclaredMethod("protectedPrint"); + assertThat(ClassUtils.getMostSpecificMethod(protectedPrintMethod, MethodsInterfaceImplementation.class)).isEqualTo(protectedPrintMethod); + assertThat(ClassUtils.getMostSpecificMethod(protectedPrintMethod, SubMethodsInterfaceImplementation.class)) + .isEqualTo(SubMethodsInterfaceImplementation.class.getDeclaredMethod("protectedPrint")); + + + Method packageAccessiblePrintMethod = MethodsInterfaceImplementation.class.getDeclaredMethod("packageAccessiblePrint"); + assertThat(ClassUtils.getMostSpecificMethod(packageAccessiblePrintMethod, MethodsInterfaceImplementation.class)) + .isEqualTo(packageAccessiblePrintMethod); + assertThat(ClassUtils.getMostSpecificMethod(packageAccessiblePrintMethod, SubMethodsInterfaceImplementation.class)) + .isEqualTo(ClassUtils.getMethod(SubMethodsInterfaceImplementation.class, "packageAccessiblePrint")); + } + @ParameterizedTest @WrapperTypes void isPrimitiveWrapper(Class type) { @@ -558,4 +584,44 @@ class ClassUtilsTests { } } + @SuppressWarnings("unused") + private interface MethodsInterface{ + + default void defaultPrint(){ + + } + void print(String messages); + } + + @SuppressWarnings("unused") + private class MethodsInterfaceImplementation implements MethodsInterface{ + + @Override + public void print(String message) { + + } + + protected void protectedPrint(){ + + } + + void packageAccessiblePrint(){ + + } + } + + @SuppressWarnings("unused") + private class SubMethodsInterfaceImplementation extends MethodsInterfaceImplementation{ + + @Override + protected void protectedPrint(){ + + } + + public void packageAccessiblePrint(){ + + } + + } + }