如何使JUnit允许我在一个测试用例中设置变量,并在另一个测试用例中访问它们(如果它们在同一个类中)
假设我有一个名为MyTest的测试类 我有三个测试如何使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
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故意不支持测试之间的依赖关系,并且不能保证执行顺序(测试套件中的测试类除外,请参阅我的答案)。因此,您确实希望两种测试方法之间存在依赖关系:
但是,如果您的安装非常昂贵,您可以将其视为一个集成测试,只接受依赖项,以节省时间。
首先,确保您的@测试以某种定义的顺序运行。 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);
}
如果你和我一样,在谷歌上搜索到这里,而答案对你没有帮助,我就留下这个:使用@beforeachWes我明白你的意思。但我认为这是一个不正确的情况。因为我必须在@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);
}