0

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

  A
  |
  B
 / \
C   D

我已经使用 JUnit4 为 C 和 D 编写了单元测试,现在我想测试 B。有没有一种聪明的方法可以做到这一点,不需要我复制所有设置 C 和 D 的代码?

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

我将如何在 JUnit4 中进行设置?

4

4 回答 4

0

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

于 2013-09-27T09:21:14.363 回答
0

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

如果您需要为许多测试的测试输入构建复杂的数据结构,测试数据构建器模式看起来非常合适::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(...);
}
于 2013-09-27T09:46:37.970 回答
0

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

于 2013-09-27T07:25:51.850 回答
0

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

如何使用测试夹具?

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

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

编辑 - -

好的,从讨论中我现在看到我误解了你的问题。我认为你要走的路是

  • 使用JUnit 测试套件设置所有对象并运行单独的测试类作为套件的一部分或
  • 通过在 B 的测试中使用 D 和 C 的模拟来解耦您的测试,因此您只需在 D 的测试中为 C 和 D 的测试中设置 C。
于 2013-09-27T07:27:20.627 回答