From 4609814e3c4a372c676e12aba08841cee193e11f Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Sat, 9 Sep 2023 21:28:24 +0200 Subject: [PATCH] BAEL-6896: Add test for public static final field lookup. (#14668) --- .../com/baeldung/reflection/Employee.java | 1 + .../PersonAndEmployeeReflectionUnitTest.java | 221 +++++++++++------- 2 files changed, 133 insertions(+), 89 deletions(-) diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/Employee.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/Employee.java index 833cf26b14..43229b3d0e 100644 --- a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/Employee.java +++ b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/Employee.java @@ -2,6 +2,7 @@ package com.baeldung.reflection; public class Employee extends Person { + public static final String LABEL = "employee"; public int employeeId; } diff --git a/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java index cb1b5e926a..0a5764171b 100644 --- a/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java +++ b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java @@ -1,6 +1,7 @@ package com.baeldung.reflection; -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import java.lang.reflect.Field; import java.lang.reflect.Modifier; @@ -9,128 +10,170 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; +import java.util.stream.Stream; -import static org.junit.Assert.*; +import org.junit.Test; public class PersonAndEmployeeReflectionUnitTest { - // Fields names private static final String LAST_NAME_FIELD = "lastName"; private static final String FIRST_NAME_FIELD = "firstName"; private static final String EMPLOYEE_ID_FIELD = "employeeId"; + private static final String EMPLOYEE_TYPE_FIELD = "LABEL"; private static final String MONTH_EMPLOYEE_REWARD_FIELD = "reward"; @Test public void givenPersonClass_whenGetDeclaredFields_thenTwoFields() { - // When - Field[] allFields = Person.class.getDeclaredFields(); + List allFields = Arrays.asList(Person.class.getDeclaredFields()); - // Then - assertEquals(2, allFields.length); - - assertTrue(Arrays.stream(allFields).anyMatch(field -> - field.getName().equals(LAST_NAME_FIELD) - && field.getType().equals(String.class)) - ); - assertTrue(Arrays.stream(allFields).anyMatch(field -> - field.getName().equals(FIRST_NAME_FIELD) - && field.getType().equals(String.class)) - ); + assertEquals(2, allFields.size()); + Field lastName = allFields.stream() + .filter(field -> field.getName() + .equals(LAST_NAME_FIELD)) + .findFirst() + .orElseThrow(() -> new RuntimeException("Field not found")); + assertEquals(String.class, lastName.getType()); + Field firstName = allFields.stream() + .filter(field -> field.getName() + .equals(FIRST_NAME_FIELD)) + .findFirst() + .orElseThrow(() -> new RuntimeException("Field not found")); + assertEquals(String.class, firstName.getType()); } @Test - public void givenEmployeeClass_whenGetDeclaredFields_thenOneField() { - // When - Field[] allFields = Employee.class.getDeclaredFields(); + public void givenEmployeeClass_whenGetDeclaredFields_thenFilterAndReturnStaticField() { + List publicStaticField = Arrays.stream(Employee.class.getDeclaredFields()) + .filter(field -> Modifier.isStatic(field.getModifiers()) && Modifier.isPublic(field.getModifiers()) && Modifier.isFinal(field.getModifiers())) + .collect(Collectors.toList()); - // Then - assertEquals(1, allFields.length); - - assertTrue(Arrays.stream(allFields).anyMatch(field -> - field.getName().equals(EMPLOYEE_ID_FIELD) - && field.getType().equals(int.class)) - ); + assertEquals(1, publicStaticField.size()); + Field employeeTypeField = publicStaticField.get(0); + assertEquals(EMPLOYEE_TYPE_FIELD, employeeTypeField.getName()); } @Test - public void givenEmployeeClass_whenSuperClassGetDeclaredFields_thenOneField() { - // When - Field[] allFields = Employee.class.getSuperclass().getDeclaredFields(); + public void givenEmployeeClass_whenGetDeclaredFields_thenTwoField() { + List allFields = Arrays.asList(Employee.class.getDeclaredFields()); - // Then - assertEquals(2, allFields.length); - - assertTrue(Arrays.stream(allFields).anyMatch(field -> - field.getName().equals(LAST_NAME_FIELD) - && field.getType().equals(String.class)) - ); - assertTrue(Arrays.stream(allFields).anyMatch(field -> - field.getName().equals(FIRST_NAME_FIELD) - && field.getType().equals(String.class)) - ); + assertEquals(2, allFields.size()); + Field employeeIdField = allFields.stream() + .filter(field -> field.getName() + .equals(EMPLOYEE_ID_FIELD)) + .findFirst() + .orElseThrow(() -> new RuntimeException("Field not found")); + assertEquals(int.class, employeeIdField.getType()); + Field employeeTypeField = allFields.stream() + .filter(field -> field.getName() + .equals(EMPLOYEE_TYPE_FIELD)) + .findFirst() + .orElseThrow(() -> new RuntimeException("Field not found")); + assertEquals(String.class, employeeTypeField.getType()); } @Test - public void givenEmployeeClass_whenGetDeclaredFieldsOnBothClasses_thenThreeFields() { - // When - Field[] personFields = Employee.class.getSuperclass().getDeclaredFields(); - Field[] employeeFields = Employee.class.getDeclaredFields(); - Field[] allFields = new Field[employeeFields.length + personFields.length]; - Arrays.setAll(allFields, i -> (i < personFields.length ? personFields[i] : employeeFields[i - personFields.length])); + public void givenEmployeeClass_whenSuperClassGetDeclaredFields_thenTwoField() { + List allFields = Arrays.asList(Employee.class.getSuperclass() + .getDeclaredFields()); - // Then - assertEquals(3, allFields.length); + assertEquals(2, allFields.size()); + Field lastNameField = allFields.stream() + .filter(field -> field.getName() + .equals(LAST_NAME_FIELD)) + .findFirst() + .orElseThrow(() -> new RuntimeException("Field not found")); + assertEquals(String.class, lastNameField.getType()); + Field firstNameField = allFields.stream() + .filter(field -> field.getName() + .equals(FIRST_NAME_FIELD)) + .findFirst() + .orElseThrow(() -> new RuntimeException("Field not found")); + assertEquals(String.class, firstNameField.getType()); + } - assertTrue(Arrays.stream(allFields).anyMatch(field -> - field.getName().equals(LAST_NAME_FIELD) - && field.getType().equals(String.class)) - ); - assertTrue(Arrays.stream(allFields).anyMatch(field -> - field.getName().equals(FIRST_NAME_FIELD) - && field.getType().equals(String.class)) - ); - assertTrue(Arrays.stream(allFields).anyMatch(field -> - field.getName().equals(EMPLOYEE_ID_FIELD) - && field.getType().equals(int.class)) - ); + @Test + public void givenEmployeeClass_whenGetDeclaredFieldsOnBothClasses_thenFourFields() { + List personFields = Arrays.asList(Employee.class.getSuperclass() + .getDeclaredFields()); + List employeeFields = Arrays.asList(Employee.class.getDeclaredFields()); + List allFields = Stream.concat(personFields.stream(), employeeFields.stream()) + .collect(Collectors.toList()); + + assertEquals(4, allFields.size()); + Field lastNameField = allFields.stream() + .filter(field -> field.getName() + .equals(LAST_NAME_FIELD)) + .findFirst() + .orElseThrow(() -> new RuntimeException("Field not found")); + assertEquals(String.class, lastNameField.getType()); + Field firstNameField = allFields.stream() + .filter(field -> field.getName() + .equals(FIRST_NAME_FIELD)) + .findFirst() + .orElseThrow(() -> new RuntimeException("Field not found")); + assertEquals(String.class, firstNameField.getType()); + Field employeeIdField = allFields.stream() + .filter(field -> field.getName() + .equals(EMPLOYEE_ID_FIELD)) + .findFirst() + .orElseThrow(() -> new RuntimeException("Field not found")); + assertEquals(int.class, employeeIdField.getType()); + Field employeeTypeField = allFields.stream() + .filter(field -> field.getName() + .equals(EMPLOYEE_TYPE_FIELD)) + .findFirst() + .orElseThrow(() -> new RuntimeException("Field not found")); + assertEquals(String.class, employeeTypeField.getType()); } @Test public void givenEmployeeClass_whenGetDeclaredFieldsOnEmployeeSuperclassWithModifiersFilter_thenOneFields() { - // When - List personFields = Arrays.stream(Employee.class.getSuperclass().getDeclaredFields()) - .filter(f -> Modifier.isPublic(f.getModifiers()) || Modifier.isProtected(f.getModifiers())) - .collect(Collectors.toList()); + List personFields = Arrays.stream(Employee.class.getSuperclass() + .getDeclaredFields()) + .filter(f -> Modifier.isPublic(f.getModifiers()) || Modifier.isProtected(f.getModifiers())) + .collect(Collectors.toList()); - // Then assertEquals(1, personFields.size()); - - assertTrue(personFields.stream().anyMatch(field -> - field.getName().equals(LAST_NAME_FIELD) - && field.getType().equals(String.class)) - ); + Field personField = personFields.stream() + .filter(field -> field.getName() + .equals(LAST_NAME_FIELD)) + .findFirst() + .orElseThrow(() -> new RuntimeException("Field not found")); + assertEquals(String.class, personField.getType()); } @Test - public void givenMonthEmployeeClass_whenGetAllFields_thenThreeFields() { - // When + public void givenMonthEmployeeClass_whenGetAllFields_thenFourFields() { List allFields = getAllFields(MonthEmployee.class); - // Then - assertEquals(3, allFields.size()); - - assertTrue(allFields.stream().anyMatch(field -> - field.getName().equals(LAST_NAME_FIELD) - && field.getType().equals(String.class)) - ); - assertTrue(allFields.stream().anyMatch(field -> - field.getName().equals(EMPLOYEE_ID_FIELD) - && field.getType().equals(int.class)) - ); - assertTrue(allFields.stream().anyMatch(field -> - field.getName().equals(MONTH_EMPLOYEE_REWARD_FIELD) - && field.getType().equals(double.class)) - ); + assertEquals(4, allFields.size()); + assertFalse(allFields.stream() + .anyMatch(field -> field.getName() + .equals(FIRST_NAME_FIELD))); + assertEquals(String.class, allFields.stream() + .filter(field -> field.getName() + .equals(LAST_NAME_FIELD)) + .findFirst() + .orElseThrow(() -> new RuntimeException("Field not found")) + .getType()); + assertEquals(int.class, allFields.stream() + .filter(field -> field.getName() + .equals(EMPLOYEE_ID_FIELD)) + .findFirst() + .orElseThrow(() -> new RuntimeException("Field not found")) + .getType()); + assertEquals(double.class, allFields.stream() + .filter(field -> field.getName() + .equals(MONTH_EMPLOYEE_REWARD_FIELD)) + .findFirst() + .orElseThrow(() -> new RuntimeException("Field not found")) + .getType()); + assertEquals(String.class, allFields.stream() + .filter(field -> field.getName() + .equals(EMPLOYEE_TYPE_FIELD)) + .findFirst() + .orElseThrow(() -> new RuntimeException("Field not found")) + .getType()); } public List getAllFields(Class clazz) { @@ -140,8 +183,8 @@ public class PersonAndEmployeeReflectionUnitTest { List result = new ArrayList<>(getAllFields(clazz.getSuperclass())); List filteredFields = Arrays.stream(clazz.getDeclaredFields()) - .filter(f -> Modifier.isPublic(f.getModifiers()) || Modifier.isProtected(f.getModifiers())) - .collect(Collectors.toList()); + .filter(f -> Modifier.isPublic(f.getModifiers()) || Modifier.isProtected(f.getModifiers())) + .collect(Collectors.toList()); result.addAll(filteredFields); return result; }