手动bean自动装配在JUnit测试

时间:2017-02-09 21:29:59

标签: 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().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对象实例后的设置方法自动装配它,如上面的代码所示。意图是拥有此类的单例并在每次测试中使用相同的实例。

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

2 个答案:

答案 0 :(得分:0)

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

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

问题在于,如果一个测试修改了对象或其内部对象的状态,则后续测试可能无法正常工作。

答案 1 :(得分:0)

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