2017-02-09 152 views
0

我的Junit测试代码如下所示。手动bean自动装配在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。不确定为什么当第二个测试方法执行时它变为空。

回答

0

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

如果您使“盒子”静态,它可能会更好。请注意,“setupDone”和“box”一起在@Before方法中进行初始化,应该位于相同的地方,无论其类为静态还是实例仅用于全局变量。

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

+0

那么你的意思是说在同一个测试类中的不同测试会有不同的应用上下文? – Hary

+0

每个测试都有不同的“this”及其所有实例变量。静态变量保留在类中,并且无论“this”的哪个实例都是相同的。 –

0

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

+0

那么应用程序上下文或bean工厂在JUnit测试中如何工作呢?每个测试都会有它自己的测试类实例和一个单独的应用程序上下文或bean工厂?它是如何工作的? – Hary

相关问题