有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用Java测试builder模式

我们在代码库中广泛使用构建器模式,构建的对象都有一个toBuilder()方法。我想写一个单元测试,确保在toBuilder()方法中没有忘记任何字段,也就是说,对于任何可构建的对象,我想做一个大致如下的测试

MyClass obj = getTestObjectWithRandomData();
assertEquals(obj, obj.toBuilder().build());

现在,我可以很容易地编写getTestObjectWithRandomData()的基本版本,它使用反射为任何对象的字段分配一组值。然而,问题是build()通常包含大量验证检查,例如,如果某个整数不在正常范围内,这些检查将引发异常。编写符合所有这些特定于类的验证检查的getTestObjectWithRandomData()的通用版本是不可能的

那么,我怎样才能做我想做的事呢?我试图将构造代码和验证代码分离到不同的方法中,这样测试就不会在验证时出错,但这意味着人们必须记住在创建对象后调用validate()或其他任何东西。不太好

还有其他想法吗


共 (1) 个答案

  1. # 1 楼答案

    用龙眼怎么样?这是你的选择吗?它会自动生成构建器代码,你再也不用担心它了。 https://projectlombok.org/features/Builder

    只需用@Builder注释类

    与龙目

    import lombok.Builder;
    import lombok.Singular;
    import java.util.Set;
    
    @Builder
    public class BuilderExample {
      private String name;
      private int age;
      @Singular private Set<String> occupations;
    }
    

    香草爪哇

    import java.util.Set;
    
    public class BuilderExample {
      private String name;
      private int age;
      private Set<String> occupations;
    
      BuilderExample(String name, int age, Set<String> occupations) {
        this.name = name;
        this.age = age;
        this.occupations = occupations;
      }
    
      public static BuilderExampleBuilder builder() {
        return new BuilderExampleBuilder();
      }
    
      public static class BuilderExampleBuilder {
        private String name;
        private int age;
        private java.util.ArrayList<String> occupations;
    
        BuilderExampleBuilder() {
        }
    
        public BuilderExampleBuilder name(String name) {
          this.name = name;
          return this;
        }
    
        public BuilderExampleBuilder age(int age) {
          this.age = age;
          return this;
        }
    
        public BuilderExampleBuilder occupation(String occupation) {
          if (this.occupations == null) {
            this.occupations = new java.util.ArrayList<String>();
          }
    
          this.occupations.add(occupation);
          return this;
        }
    
        public BuilderExampleBuilder occupations(Collection<? extends String> occupations) {
          if (this.occupations == null) {
            this.occupations = new java.util.ArrayList<String>();
          }
    
          this.occupations.addAll(occupations);
          return this;
        }
    
        public BuilderExampleBuilder clearOccupations() {
          if (this.occupations != null) {
            this.occupations.clear();
          }
    
          return this;
        }
    
        public BuilderExample build() {
          // complicated switch statement to produce a compact properly sized immutable set omitted.
          // go to https://projectlombok.org/features/Singular-snippet.html to see it.
          Set<String> occupations = ...;
          return new BuilderExample(name, age, occupations);
        }
    
        @java.lang.Override
        public String toString() {
          return "BuilderExample.BuilderExampleBuilder(name = " + this.name + ", age = " + this.age + ", occupations = " + this.occupations + ")";
        }
      }
    }