BAEL-6896: Add test for public static final field lookup. (#14668)

This commit is contained in:
Harry9656 2023-09-09 21:28:24 +02:00 committed by GitHub
parent e6a231d824
commit 4609814e3c
2 changed files with 133 additions and 89 deletions

View File

@ -2,6 +2,7 @@ package com.baeldung.reflection;
public class Employee extends Person {
public static final String LABEL = "employee";
public int employeeId;
}

View File

@ -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<Field> 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<Field> 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<Field> 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<Field> 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<Field> personFields = Arrays.asList(Employee.class.getSuperclass()
.getDeclaredFields());
List<Field> employeeFields = Arrays.asList(Employee.class.getDeclaredFields());
List<Field> 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<Field> personFields = Arrays.stream(Employee.class.getSuperclass().getDeclaredFields())
.filter(f -> Modifier.isPublic(f.getModifiers()) || Modifier.isProtected(f.getModifiers()))
.collect(Collectors.toList());
List<Field> 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<Field> 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<Field> getAllFields(Class clazz) {
@ -140,8 +183,8 @@ public class PersonAndEmployeeReflectionUnitTest {
List<Field> result = new ArrayList<>(getAllFields(clazz.getSuperclass()));
List<Field> 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;
}