我有三个我需要测试的类,比如说Load,Transform,Perform,它们都开始或者工作在同一个数据对象上,至少就是所需要的,从一个数据对象X开始,Load方法执行它们的东西然后它被赋予Transform,它也用它的方法来做它的东西,以及一个稍微改变数据对象并且它准备就绪的Perform。
现在我想为Load,Transform和Perform编写测试。
测试数据对象,我应该在Load类中创建一个静态方法,如
public static TestData makeTestData(...makeit...)
或者我应该制作TestDataMock或TestDataTest类?哪个可以回复一个例子呢?并在需要处理它们时,在每个Load,Transform和Perform中创建一个新的TestDataTest类?
答案 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之后,或者甚至只是对某个更高级别类的单个方法调用。然后将这种外观或高级方法视为单元测试。
或者,你是否试图说你不知道如何孤立地测试你的三个类,因为它们是紧密耦合的,并且如果不参考另外两个类就无法描述一个类的行为?这表明你的设计很糟糕:考虑重新设计,这样你就可以独立地描述每个类的所需行为,并因此单独测试它们(至少部分地)。