有没有办法在准备测试时运行另一个测试的设置?

时间:2013-09-27 07:19:24

标签: java unit-testing junit junit4

我是单元测试的新手,我正试图像这样测试树状结构:

  A
  |
  B
 / \
C   D

我已经使用JUnit4编写了C和D的单元测试,现在我想测试B.是否有一种聪明的方法来执行此操作,这不需要我复制所有设置C和D的代码?< / p>

我基本上想首先运行C和D的测试,然后加载这些数据结构,运行B的测试,然后运行A的测试,一次性完成,没有任何拆除。

我如何在JUnit4中进行设置?

4 个答案:

答案 0 :(得分:0)

C和D扩展B,因此您可以使用C / D对象访问B的方法。当B扩展A时,您也可以使用C / D对象访问A的方法。 (除非他们被覆盖)

答案 1 :(得分:0)

无法保证在Junit中执行测试的顺序。这是故意的,因为单独的测试不应该相互依赖。

  

How do I use a test fixture?

     

(...)不保证测试方法调用的顺序,因此testOneItemCollection()可能在testEmptyCollection()之前执行。 (...)

也许您可以解释一下为什么要实现这种特定行为?我不确定你写的是什么,为什么你需要这个单一的设置和固定的测试顺序。

编辑---

好的,从讨论中我现在看到我很想念你的问题。我认为要找你的方法是

  • 使用JUnit Test Suites to setup all your objects并将单独的测试类作为套件的一部分运行或
  • 在B的测试中使用D和C的模拟来解耦测试,因此您只需要在D测试中的C和D测试中设置C。

答案 2 :(得分:0)

您可以使用@Before注释创建setup方法,以便在运行测试之前加载数据结构。 每次运行测试时,setup方法中的所有代码都将首先运行。

答案 3 :(得分:0)

我建议保持所有测试独立。单元测试的想法是在完全与其他测试隔离的精确定义的前提条件下测试每个单元,以便能够非常容易地缩小问题范围。如果您的测试依赖于其他人的设置并处理其他测试操作过的数据 - 想象一个测试失败。你怎么知道究竟出了什么问题?它可能是您使用的设置,或者您的测试失败,因为前驱测试错误地修改了数据,而前者测试又显示成功等等。

如果您需要为许多测试构建测试输入的复杂数据结构,那么Test Data Builder Pattern看起来非常合适:: http://www.natpryce.com/articles/000714.html

看起来像是:

public void test_SomeSpecificPropertyInB_WhenPreconditionIsLikeSoAndSo_ResultsInThisAndThat {
    // Arrange
    B sut = AbcdTreeBuilder.WithPreconditionLikeSoAndSo().Build();

    // Act
    SomeResultType result = sut.DoSomething();

    // Assert
    equals(...);
}