java - 在 JUnit 测试中是否有设置测试主题的规则

标签 java junit annotations

我最近写了很多 JUnit 测试,看到了同样的样板模式。

public class MathOpTest {
   private MathOp a;

   @Before
   public void setUp(){
      a = new MathOp();
   }
   ...
}

是否有注释可以为我设置它,因为我总是需要编写一个 setUp 方法,而且它通常只有我正在测试的单个类。

类似于:

public class MathOpTest {
   @TestSubject
   private MathOp a;
   ...
}

最佳答案

您可以在声明时分配字段:

public class MathOpTest {
  private final MathOp mathOp = new MathOp();

  ...
}

这简单明了,所以我建议您尽可能在声明时在测试类中分配字段(当然是在您提供的情况下)。

如果您想了解更多,请继续阅读。

  • JUnit 将为每个测试方法创建一个唯一的测试类实例,因此即使您的测试修改了 MathOp 的内部状态,只要您的测试不这样做,以这种方式使用字段是安全的修改全局状态。
  • 对于 JUnit4 风格的测试(即不扩展 junit.framework.TestCase 的测试),JUnit 将在测试方法运行之前创建测试类,并使其符合垃圾回收条件测试方法完成。

使用@Before 方法进行更复杂的初始化。

通常我在以下情况下使用@Before:

  • 字段的初始化比较复杂
  • 字段的初始化需要调用声明为抛出检查异常的代码
  • 您需要在应用@Rule 后进行初始化(例如,将模拟注入(inject)构造函数)

通常,当类需要针对不同的用例以不同的方式构造时,您会在测试方法中创建被测对象。

示例

下面是一个使用@BeforeinitMocks() 的例子:

public class MathOpTest {
  @Mock private Calculator mockCalculator;
  @Mock private Supplier<Double> mockPreviousResultSupplier;
  private MathOp mathOp;

  @Before
  public void createMathOp() {
    MockitoAnnotations.initMocks(this);
    mathOp = new MathOp(
        mockCalculator, mockPreviousResultSupplier);
  }

  ...
}

这是使用 @Rule 结果的 @Before 方法示例:

public class MyWriterTest {
  @Rule public final TemporaryFolder folder = new TemporaryFolder();
  private File output;
  private MyWriter writer;

  @Before
  public void createMyWriter() {
    output = folder.newFile();
    writer = new MyWriter(output);
  }

  ...
}

旁白:我个人不建议使用 @InjectMocks 来创建您正在测试的类。这对我来说太神奇了。有一个明确的构造函数更清晰、更简单,我喜欢我的测试清晰和简单:-)

关于java - 在 JUnit 测试中是否有设置测试主题的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30676043/

相关文章:

java - 如何拦截用户与 UI 交互产生的 motionEvents 和 keyEvents

java - 如何在Android中的字符串中使用\n换行(从linux输入)

java - 什么是 Xuggler 的好替代品,因为它的开发已经停止?

java - 我在考试课上错过了什么?

java - 想要使用共享的 @BeforeClass/@AfterClass 和 Spring App Context 运行许多 jUnit 测试类

java - 当路径包含任何空格时,在 Java ist 中加载文件不起作用,例如%20

java - 我应该把上传的图片放在 java 应用程序的服务器上的什么地方?

java - 如何防止 JAXB 在编码时绑定(bind) @XmlRootElement 的父类(super class)方法?

java - 使带注释的困惑远离领域模型

java - 如果我将变量声明为其抽象父类(super class),Scala 的 @throws 注释将在 javac 中被忽略