如何在每个@Test
之间收到新的bean?
示例:
public class Person(){
private String name = "bob";
//getters //setters
}
public Class MyTest(){
@Autowired
private Person person;
@Test
public void firstName(){
person.setName = "Peter";
system.out.println(person.getName());
(Should print out Peter)
}
@Test
public void firstNameTest2(){
system.out.println(person.getName());
(Should be reset and print bob)
}
我一直在使用@DirtiesContext(classMode = ClassMode.ON_TEST_METHOD)
作为TestClass Annotation,但这很可怕..我的其他框架在每次测试之间重新启动...并且将所有内容减慢一整分钟。
我试图配置自定义范围,我实现了Spring Listeners ...我在每个测试方法后重置了我的Person Bean ...
但是,这仅适用于类级别,它不会在@Test
范围之间为我提供新的Person对象。
谢谢,如果您需要更多代码来澄清,请与我们联系。
答案 0 :(得分:0)
取决于您正在使用的框架。但无论如何,您需要一个范围为prototype
的bean,而不是singleton
。为每个依赖注入创建一个新的prototype
bean:
<bean id="obj" class="java.lang.Object" scope="prototype"/>
JUnit及其指标。 JUnit的特性是它为每个测试方法重新创建测试类以用于隔离目的。这意味着每次都会重新初始化其字段,因此您无需执行任何操作即可使prototype
bean工作 - 只需@Autowire
该字段。
<强> TestNG的即可。这个框架不会重新创建测试类,所以让prototype
为每个方法工作更加复杂:
@Autowired Object obj;
@Autowired ApplicationContext appContext;
@BeforeMethod
public void injectSpringBeans() {
obj = appContext.getBean("obj");
}
可以使用工厂创建测试数据。在您的示例中,您创建了Person
的实例,它看起来像测试数据。 Spring用于初始化交叉依赖bean的图形。如果对象没有依赖关系并且不在多个其他bean之间共享,则在目标类中创建它或使用工厂更自然。
Webdriver与Page Objects共享。问题标题是关于webdriver
的。如果您使用的页面对象框架也有webdriver
的链接,那么您将使用与其他代码不同的Web驱动程序。这根本行不通。此外,webdriver
在测试中很少使用 - 它通常完全由业务层或页面对象层隐藏。有关详细信息,请阅读this article。如果您需要新的webdriver实例,请准备重新创建许多其他对象。
您可以实现自己的Spring作用域,或者为所有测试bean使用thread
作用域,并在自己的线程中运行每个方法(TestNG允许)。但这会很复杂,并且在创建新的webdriver
会话时表现不佳意味着启动一个非常昂贵的新浏览器。