我怎样才能让 JUnit 让我在一个测试用例中设置变量并在另一个测试用例中访问它们(如果它们在同一个类中)

Ank*_*kur 5 junit

假设我有一个名为 MyTest 的测试类。

其中我有三个测试。

public class MyTest {

AnObject object;

@Before
public void setup(){
  object = new AnObject();
  object.setSomeValue(aValue);
}

@Test
public void testMyFirstMethod(){
    object.setAnotherValue(anotherValue);
    // do some assertion to test that the functionality works
    assertSomething(sometest);
}

@Test
public void testMySecondMethod(){
    AValue val = object.getAnotherValue();
    object.doSomethingElse(val);
    // do some assertion to test that the functionality works
    assertSomething(sometest);
}
Run Code Online (Sandbox Code Playgroud)

有什么办法可以使用 的值anotherValue,该值是在第一个测试中通过其设置器设置的,在第二个测试中。我正在使用它来测试数据库功能。当我在数据库中创建一个对象时,我想获得它的 GUID,这样我就可以在以后的测试方法中使用它来进行更新和删除,而不必对 GUID 进行硬编码,从而使其与将来的使用无关。

Mat*_*ell 5

您在两个测试之间引入了依赖关系。JUnit 故意不支持测试之间的依赖关系,也无法保证执行的顺序(测试套件中的测试类除外,请参阅我对Has JUnit4 开始支持测试顺序?是故意的吗?)的回答。所以你真的想在两个测试方法之间建立依赖关系:

  1. 您必须使用中间静态值
  2. 正如 Cedric 建议的那样,使用 TestNG,它专门支持依赖项
  3. 在这种情况下,您可以创建一个方法来创建该行,并从这两种方法中调用它。

我个人更喜欢 3,因为:

  1. 我得到了独立的测试,我可以只运行第二个测试(在 Eclipse 或类似的环境中)
  2. 在我在课堂上的拆解中,我可以从数据库中删除该行,即清理。这意味着无论我运行哪个测试,我总是从相同的(已知)数据库状态开始。

但是,如果您的设置非常昂贵,您可以将其视为集成测试并只接受依赖项,以节省时间。


Ced*_*ust 3

如果您需要这个,您应该使用TestNG(我同意它在集成测试中相当常见)。TestNG 使用相同的实例来运行测试,因此在测试之间保留存储在字段中的值,这在创建对象的成本昂贵时非常有用(JUnit 强制您使用静态来实现相同的效果,应该避免这种情况)。