Java 手动bean自动布线不';不能在JUnit测试中工作

Java 手动bean自动布线不';不能在JUnit测试中工作,java,spring,junit,Java,Spring,Junit,我的Junit测试代码如下所示 private static boolean setupDone = false; private Box box; @Before public void setup(){ if (setupDone){ return true; } box = new BoxCreator(this.applicationContext); applicationContext.getAutowireCapableBeanFactory().a

我的Junit测试代码如下所示

private static boolean setupDone = false;
private Box box;

@Before
public void setup(){

  if (setupDone){
    return true;
  }

  box = new BoxCreator(this.applicationContext);

  applicationContext.getAutowireCapableBeanFactory().autowireBean(box);

  setupDone = true;
}

@Test
public void Test1(){
  String response = box.getBoxResponse();

  ...asserts go here as usual....
}

@Test
public void Test2(){
 String response = box.getBoxResponse();

 ...asserts go here as usual....
}
现在发生的是,Setup方法根据setupDone变量的需要只运行一次

创建Box对象的实例后,Setup方法会自动连接它,如上面的代码所示。目的是让这个类有一个单例,并在每个测试中使用相同的实例


现在的问题是,无论哪个测试方法首先运行,都会获得box对象的值,而第二个测试方法将box视为null。不确定为什么在执行第二个测试方法时它会变为null。

我怀疑它没有在每个测试方法的运行中使用相同的测试类实例

如果将“box”设为静态,它可能会工作得更好。请注意,“setupDone”和“box”一起在@Before方法中初始化,并且应该位于相同的位置,无论是静态类还是全局变量实例


问题是,如果一个测试修改了对象或其内部对象的状态,下面的测试可能无法正常工作。

正如Lee Meador所提到的,JUnit在调用每个@test方法之前创建了测试类的新实例。通过这样做,它提供了测试方法之间的独立性,并避免了测试代码中无意的副作用。每个测试都应该单独执行,而不受前一个测试的影响,因此在您的案例中应该有不同的应用程序上下文。

那么您的意思是说同一测试类中的不同测试将有不同的应用程序上下文?每个测试都有不同的“this”及其所有实例变量。静态变量保留在类中,并且无论“this”的哪个实例都是相同的。那么应用程序上下文或bean工厂在JUnit测试中是如何工作的呢?每个测试都有自己的测试类实例和一个单独的应用程序上下文或bean工厂?这就是它的工作原理吗?