请求新的单例bean" WebDriver"每个@Test范围之间

时间:2015-12-17 07:04:53

标签: java spring selenium testing testng

如何在每个@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对象。

谢谢,如果您需要更多代码来澄清,请与我们联系。

1 个答案:

答案 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会话时表现不佳意味着启动一个非常昂贵的新浏览器。