我的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。
答案 0 :(得分:0)
我怀疑它没有为每个测试方法的运行使用相同的测试类实例。
如果你制作" box"静态,它可能会更好。请注意" setupDone"和"框"在@Before方法中一起初始化,并且应该位于相同的位置,无论是静态类还是实例仅仅是全局变量。
问题在于,如果一个测试修改了对象或其内部对象的状态,则后续测试可能无法正常工作。
答案 1 :(得分:0)
正如Lee Meador所提到的,JUnit在调用每个@Test方法之前创建了一个新的测试类实例。通过这样做,它提供了测试方法之间的独立性,并避免了测试代码中的无意的副作用。每个测试都应该单独执行而不会影响之前的测试,因此在您的情况下应该有不同的应用程序上下文。