Java Junit测试是否共享相同的数据对象?我应该嘲笑它吗?

Java Junit测试是否共享相同的数据对象?我应该嘲笑它吗?,java,testing,junit,Java,Testing,Junit,我有三个类需要测试,比如Load、Transform、Perform,它们都是从同一个数据对象开始或工作的,至少这是必需的,从一个数据对象X开始,Load方法在它上面执行它们的操作,然后它被赋予Transform,Transform也用它的方法执行它的操作,和一个执行,它稍微改变了数据对象,它就准备好了 现在我想为加载、转换和执行编写测试 测试数据对象,我应该在Load类中创建一个静态方法吗 public static TestData makeTestData(...makeit...) 或

我有三个类需要测试,比如Load、Transform、Perform,它们都是从同一个数据对象开始或工作的,至少这是必需的,从一个数据对象X开始,Load方法在它上面执行它们的操作,然后它被赋予Transform,Transform也用它的方法执行它的操作,和一个执行,它稍微改变了数据对象,它就准备好了

现在我想为加载、转换和执行编写测试

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

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

或者我应该创建一个TestDataMock或TestDataTest类?哪一个可以返回它的示例?并在每个加载中创建一个新的TestDataTest类,在需要时进行转换和执行?

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


或者,您可以将负载、转换和执行操作组合到一个测试用例中,但这更多的是集成测试而不是单元测试。

大多数测试用例类的样式应该是:如果您有一个类X,那么它有一个对应的类X
测试。但这不是做事的唯一方式;如果您有一组协作的类,那么可以使用JUnit对协作类进行一些低级集成测试。您只需要为这个测试用例类想出一个合适的名称

但是,如果您有一组协作类,请考虑隐藏在A后面的事实,甚至只是一些高级类的单个方法调用。然后将facade或high-lelve方法视为单元测试


或者,你是想说,你不知道如何单独测试你的三个类,因为它们是紧密耦合的,一个类的行为不能在不参考其他两个类的情况下进行描述?这表明你有一个糟糕的设计:考虑重新设计,这样你就可以孤立地描述每个类的所需行为,因此孤立地测试它们(至少部分地)。

听起来是一个很好的例子,依赖关系会很有用,所以你不必每次都重新创建对象(或者更糟,模仿它)。除此之外,您还可以处理前一阶段生成的实际输出,并且不必使用静态(总是代码味道)

JUnit不支持依赖项,但支持:


如果
transform()
失败,最终报告将显示
“1个通过(加载)、1个失败(转换)和1个跳过(执行)”
,并且您确切地知道要查找的位置。

它们并不是紧密耦合的,只是它们作用于相同的数据-在应用程序之外的键值形式。第二个类依赖于第一个类来完成一个好的工作,否则第二个类会失败,然后第三个也会失败。“第二个类依赖于第一个类来完成一个好的工作”:这对我来说意味着你们的类确实是紧密耦合的,如果为第二个类设置有效输入数据的唯一方法是使用第一个类。尝试将在类之间流动的数据抽象为一个新类,它描述了这三个类正在操作的类型。您的类具有过程名称,例如
Load
Transform
Perform
也表明您有设计问题。
@Test
public void load() { ... }

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


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