Junit测试共享相同的数据对象?我应该嘲笑它还是什么?

时间:2011-08-19 10:12:08

标签: java testing junit

我有三个我需要测试的类,比如说Load,Transform,Perform,它们都开始或者工作在同一个数据对象上,至少就是所需要的,从一个数据对象X开始,Load方法执行它们的东西然后它被赋予Transform,它也用它的方法来做它的东西,以及一个稍微改变数据对象并且它准备就绪的Perform。

现在我想为Load,Transform和Perform编写测试。

测试数据对象,我应该在Load类中创建一个静态方法,如

public static TestData makeTestData(...makeit...)

或者我应该制作TestDataMock或TestDataTest类?哪个可以回复一个例子呢?并在需要处理它们时,在每个Load,Transform和Perform中创建一个新的TestDataTest类?

3 个答案:

答案 0 :(得分:2)

您应该始终努力使单元测试彼此独立。因此,您应始终为每个测试创建任何新的输入测试数据。您要测试的是“给定输入数据X,验证输出是否为Y”。 JUnit具有@Before注释,您可以使用它来注释在该类中的每个测试用例之前运行的方法。通常,您可以在此处放置所有设置代码(创建和初始化模拟对象,创建或加载测试数据等)。

另外,您可以将Load,Transform和Perform操作组合到一个测试用例中,但这更像是集成测试而不是单元测试。

答案 1 :(得分:2)

听起来像一个很好的例子,其中依赖项很有用,因此您不必每次都重新创建对象(或者更糟糕的是,模拟它)。最重要的是,你使用前一阶段产生的实际输出,你不必使用静态(总是代码味道)。

JUnit不支持依赖关系,但TestNG执行:

@Test
public void load() { ... }

@Test(dependsOnMethods = "load")
public void transform() { ... }


@Test(dependsOnMethods = "transform")
public void perform() { ... }

如果transform()失败,最终报告会说"1 Passed (load), 1 Failed (transform) and 1 Skipped (perform)",您确切知道要查看的位置。

答案 2 :(得分:0)

大多数测试用例类应该采用testcase class per class的样式:如果你有一个类 X ,它有一个对应的类 X {{1} }。但这不是唯一的做事方式;如果你有一组合作的类,你可以使用JUnit进行合作类的一些低级集成测试。您只需要考虑此测试用例类的合适名称。

但是,如果您有一组合作类,请考虑将该事实隐藏在facade之后,或者甚至只是对某个更高级别类的单个方法调用。然后将这种外观或高级方法视为单元测试。

或者,你是否试图说你不知道如何孤立地测试你的三个类,因为它们是紧密耦合的,并且如果不参考另外两个类就无法描述一个类的行为?这表明你的设计很糟糕:考虑重新设计,这样你就可以独立地描述每个类的所需行为,并因此单独测试它们(至少部分地)。