如何使JUnit允许我在一个测试用例中设置变量,并在另一个测试用例中访问它们(如果它们在同一个类中)

如何使JUnit允许我在一个测试用例中设置变量,并在另一个测试用例中访问它们(如果它们在同一个类中),junit,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 so

假设我有一个名为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);
}

是否有任何方法可以使用
另一个值的值
,该值是在第一次测试和第二次测试中用其setter设置的。我使用它来测试数据库功能。当我在DB中创建一个对象时,我想获取它的GUID,这样我就可以在以后的测试方法中使用它来进行更新和删除,而不必硬编码GUID,从而使它与将来的使用无关。

您不应该这样做。测试应该能够以随机顺序运行。如果您想测试依赖于数据库中一个值的东西,可以在@Before代码中进行测试,这样就不会对每个测试用例都重复这些操作。

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

您引入了两个测试之间的依赖关系。JUnit故意不支持测试之间的依赖关系,并且不能保证执行顺序(测试套件中的测试类除外,请参阅我的答案)。因此,您确实希望两种测试方法之间存在依赖关系:

  • 必须使用中间静态值
  • 正如Cedric所建议的,使用TestNG,它专门支持依赖关系
  • 在这种情况下,您可以创建一个方法来创建行,并从两个方法中调用它
  • 我个人更喜欢3,因为:

  • 我有独立的测试,我可以只运行第二个测试(在Eclipse或类似的环境中)
  • 在我的课堂拆卸中,我可以从数据库中删除这行代码,即清理。这意味着无论运行哪个测试,我总是以相同(已知)的数据库状态开始

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

    首先,确保您的@测试以某种定义的顺序运行。 i、 e.@FixMethodOrder(methodsorter.NAME_升序) 在下面的示例中,我假设test2将在test1之后运行 要在它们之间共享变量,请使用ThreadLocal(来自java.lang)。 请注意,ThreadLocal变量的作用域是线程,因此如果您运行多个线程,每个线程都将有一个“email”副本(本例中的static表示该线程的唯一全局变量)

    private static ThreadLocal email=new ThreadLocal();
    @试验
    公共无效测试1{
    email.set(“hchan@apache.org);
    }
    @试验
    公开无效测试2{
    System.out.println(email.get());
    }
    
    我找到了很好的解决方案,只需在前面的测试中添加Before注释

    private static String email = null;
    @Before
    @Test
    public void test1 {
        email = "test@google.com"
    }
    
    @Test
    public void test2 {
       System.out.println(email);
    }
    

    如果你和我一样,在谷歌上搜索到这里,而答案对你没有帮助,我就留下这个:使用@beforeach

    Wes我明白你的意思。但我认为这是一个不正确的情况。因为我必须在@Before代码中加入潜在的未经测试的功能。然后在所有测试开始时调用一个函数。Y你不想让它让你无法并行运行测试。维护状态与并行运行测试并不是相互排斥的,看看TestNG是如何做到的(以及我的答案)。感谢后续的工作,我喜欢将代码放在一个单独的方法中。谢谢,我最近从TestNG转到JUnit(虽然显然不是专家)因此,这将是一个简单的步骤。嗯……我应该更经常地使用teardown!当同一个类中已经有一个用@Before注释的方法时,这将不起作用。你可以一直使用它,至少它仍然是一个解决方案。这对我有效,但对于JUnit5,你必须使用:
    @BeforeTestMethod
    private static String email = null;
    @Before
    @Test
    public void test1 {
        email = "test@google.com"
    }
    
    @Test
    public void test2 {
       System.out.println(email);
    }