【问题标题】:Global mock objects for tests?用于测试的全局模拟对象?
【发布时间】:2021-09-22 10:06:17
【问题描述】:

我正在创建 Spring Boot Web 应用程序,并且我正在使用 JUnit 5 进行单元测试。

我对单元测试有一个顾虑。在一个类中使一些模拟对象成为全局对象,当我们在不同的测试类中需要它们时,只需使用函数返回它们,这是一种好的做法吗?

我问这个是因为我最近在我的模型类中添加了一个新字段,并且需要修改一堆测试类并将这个字段添加到每个测试类的构造函数中。

我们以 Semester、Module 和 Course 三个类为例,其中 Course 有 Semester 和 Module 作为字段:

@AllArgsConstructor
public class Module{
  private Long id;
  private String name;
}


@AllArgsConstructor
public class Semester{
  private Long id;
  private LocalDate startingDate;
}

@AllArgsConstructor
public class Course {
  private Long id;
  private String name;
  private Module module;
  private Semester semester;
}

现在,在我们需要某种 Course 对象的所有测试类中,我们需要创建所有这些对象,如下所示:

private final Module mockModule = Module(1L, "Computer Sciences");
private final Semester mockSemester = Semester(1L, LocalDate.of(2021, Month.MARCH, 1));
private final Course mockCourse = Course(1L, "DSA", mockModule, mockSemester); 

一段时间后,我们发现模块类中还需要一个字段,例如codeName:

@AllArgsConstructor
public class Module{
  private Long id;
  private String name;
  private String codeName;
}

在这一字段更改后,我们将需要编辑我们使用模块构造函数的所有测试类。如果我们想在 Semester 类中添加新字段,情况也是如此。

但是在我们在一个类中拥有所有模拟对象的情况下,我们只需要在这一类中编辑构造函数,而不是在所有测试类中。测试类中的代码将是:

private final Course mockCourse = mockObjects.getMockCourse();

有没有一种“更清洁”的方式来做到这一点?

我试图找到答案,但在所有关于单元测试的教程/文章中,我发现每个测试类都有自己的模拟对象。

【问题讨论】:

    标签: java unit-testing testing junit spring-test


    【解决方案1】:

    您可以在此处应用Object Mother 模式并创建一个全局工厂类来构造用于多个测试的对象以减少样板代码。如果您的对象结构发生变化,您只需触摸一个文件(最多)。

    Tom Hombergs 写了一篇很棒的文章,他展示了 Object Mother in combination with the builder pattern

    最后,你会得到如下内容:

    CourseMother.completedCourse();
    CourseMother.emptyCourse();
    // etc.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-30
      • 2014-05-17
      • 2012-12-17
      • 2011-03-15
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多