在JUnit测试中,有一个规则来设置测试的主题

时间:2015-06-05 21:23:08

标签: 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;
   ...
}

2 个答案:

答案 0 :(得分:1)

在我的回忆中,香草JUnit中没有这样的东西直接存在。大多数人选择在@Before语句中或在测试内部初始化他们的测试主题。在它的辩护中,它清楚地表明在测试运行之前建立的是什么,并且它总是重置测试对象的状态。

如果您正在使用Mockito,实际上您确实可以使用@InjectMocks声明一个类并使用http://1drv.ms/1KfCiHK进行注释来实例化该类并注入之前的任何@Mock类。

答案 1 :(得分:1)

您可以在声明字段时指定字段:

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

  ...
}

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

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

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

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

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

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

通常,当需要为不同的用例构造类的不同方法时,您将在测试方法中创建测试对象。<​​/ p>

<强>实施例

以下是使用@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);
  }

  ...
}

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

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来创建您正在测试的课程。这对我来说太神奇了。拥有一个明确的构造函数更简洁,我喜欢我的测试清晰简单: - )