JUnit Extensions randomBeans:排除集合内对象属性失效问题求助
解决RandomBeans集合元素属性排除失效的问题
我之前也碰到过RandomBeans处理集合属性排除的这个坑!你遇到的情况是因为工具的images[].id这类通配符语法仅对集合的第一个元素生效,后续元素不会自动应用这条排除规则。下面给你两种可行的解决思路:
方法一:为集合元素单独配置生成规则
我们可以先创建一个针对Image类的生成器,提前排除掉id和lastUpdate属性,再让Album的images集合使用这个生成器来生成所有元素:
import io.github.benas.randombeans.EnhancedRandom; import io.github.benas.randombeans.EnhancedRandomBuilder; import io.github.benas.randombeans.TypeToken; import java.util.List; import java.util.stream.Collectors; // 先定义Image的专属生成器,排除指定属性 EnhancedRandom imageRandom = EnhancedRandomBuilder.aNewEnhancedRandomBuilder() .exclude(Image.class, "id", "lastUpdate") .build(); // 再定义Album的生成器,指定images集合使用上面的Image生成器 EnhancedRandom albumRandom = EnhancedRandomBuilder.aNewEnhancedRandomBuilder() .randomize(new TypeToken<List<Image>>() {}, () -> imageRandom.objects(Image.class, 5).collect(Collectors.toList())) .build(); // 生成符合要求的Album对象 Album album = albumRandom.nextObject(Album.class);
这种方式的好处是针对性强,你可以精确控制集合元素的生成逻辑,甚至指定集合的大小(上面示例里是5个元素)。
方法二:全局自定义排除策略
如果希望所有Image对象(不管是在集合里还是单独生成)都自动排除id和lastUpdate,可以自定义一个ExclusionPolicy,让全局生成器都遵守这个规则:
import io.github.benas.randombeans.EnhancedRandom; import io.github.benas.randombeans.EnhancedRandomBuilder; import io.github.benas.randombeans.api.ExclusionPolicy; import java.lang.reflect.Field; import java.lang.reflect.Method; ExclusionPolicy imageExclusionPolicy = new ExclusionPolicy() { @Override public boolean shouldBeExcluded(Field field) { // 判断当前字段是否属于Image类的id或lastUpdate属性 return Image.class.isAssignableFrom(field.getDeclaringClass()) && ("id".equals(field.getName()) || "lastUpdate".equals(field.getName())); } @Override public boolean shouldBeExcluded(Method method) { // 同步排除对应的setter方法,避免工具通过setter注入值 return Image.class.isAssignableFrom(method.getDeclaringClass()) && (method.getName().equals("setId") || method.getName().equals("setLastUpdate")); } }; // 使用自定义策略创建生成器 EnhancedRandom random = EnhancedRandomBuilder.aNewEnhancedRandomBuilder() .withExclusionPolicy(imageExclusionPolicy) .build(); // 生成Album对象,所有Image元素的id和lastUpdate都会被排除 Album album = random.nextObject(Album.class);
这种方式更灵活,一次配置就能覆盖所有场景,适合需要全局统一规则的情况。
两种方法都能解决你遇到的“仅第一个元素生效”的问题,你可以根据自己的需求选择。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

