Cette fois, c'est une méthode pour remplir le champ de l'objet argument avec une valeur appropriée. Dans JUnit, vous dites souvent: "Je veux remplir le champ pour un certain objet pour le moment, mais c'est trop ennuyeux d'appeler le passeur un par un!" Dans un tel cas, j'ai créé une méthode qui remplit les champs de manière appropriée.
Ce que j'ai fait la dernière fois → Celui qui exécute la méthode privée
ReflectionUtil.java
public static void fillAllFields(Object obj, int offset) throws IllegalArgumentException, IllegalAccessException {
Assertions.assertThat(offset >= 0);
boolean b = true;
char c=(char) (65 + offset); // A+
Field[] fieldList = obj.getClass().getDeclaredFields();
for (int i = 0; i < fieldList.length; i++) {
int num = i + offset;
Field f = fieldList[i];
f.setAccessible(true);
String name = f.getName();
Class<?> clazz = f.getType();
if (Modifier.isFinal(f.getModifiers())) {
continue;
}
if (clazz == String.class) {
f.set(obj, name + num);
} else if (clazz == Date.class) {
Calendar calendar = Calendar.getInstance();
int d = num % 28;
calendar.set(2019, Calendar.MARCH, d);
f.set(obj, calendar.getTime());
} else if (clazz == Timestamp.class) {
Calendar calendar = Calendar.getInstance();
int d = num % 28;
calendar.set(2019, Calendar.MARCH, d);
f.set(obj, new Timestamp(calendar.getTimeInMillis()));
} else if(clazz==boolean.class ||clazz==Boolean.class ){
f.set(obj, b);
b=!b;
} else if(clazz==BigDecimal.class){
f.set(obj, new BigDecimal(num));
} else if(clazz==int.class||clazz==Integer.class){
f.set(obj, num);
} else if(clazz==long.class||clazz==Long.class){
f.set(obj, ((Integer) num).longValue());
} else if(clazz==float.class||clazz==Float.class){
f.set(obj, ((Integer) num).floatValue());
} else if(clazz==double.class||clazz==Double.class){
f.set(obj, ((Integer) num).doubleValue());
} else if(clazz==short.class||clazz==Short.class){
f.set(obj, ((Integer) num).shortValue());
} else if(clazz==byte.class||clazz==Byte.class){
f.set(obj, ((Integer) num).byteValue());
} else if(clazz==char.class||clazz==Character.class){
if (c < 65 || 90 < c) c = 65;
f.set(obj, ((char) c));
c++;
}
}
}
EntityA.java
@Data
public class EntityA {
private String str;
private Date date;
private Timestamp ts;
private Boolean bool;
private BigDecimal bd;
private Integer i;
private long l;
private Float f;
private double d;
private Short s;
private byte b;
private Character c;
}
Tests.java
@Test
public void test1() {
EntityA entity= new EntityA();
try {
ReflectionUtil.fillAllFields(entity, 25);
System.out.println(entity);
} catch (IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
fail();
}
}
console
EntityA(str=str25, date=Tue Mar 26 02:05:01 JST 2019, ts=2019-03-27 02:05:01.786, bool=true, bd=29, i=30, l=31, f=32.0, d=33.0, s=34, b=35, c=Z)
Que faites-vous quand le miso est du charbon? Cette méthode se concentre sur l'alphabet supérieur A-Z. D'autres classes seront ajoutées au besoin. Je suis désolé s'il y a un bogue car je n'ai pas vérifié la valeur limite.
C'est devenu une méthode Java héritée, mais je voulais vraiment incorporer Java 8 autant que possible.
Ou est-il probable qu'un tel utilitaire se trouve dans une bibliothèque en premier lieu? ??
Recommended Posts