【问题标题】:Request new singleton bean "WebDriver" between each @Test scope在每个 @Test 范围之间请求新的单例 bean“WebDriver”
【发布时间】:2015-12-17 07:04:52
【问题描述】:

如何在每个 @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 注释,但是,这太可怕了..我的其他框架在每次测试之间重新初始化...并将一切都减慢了整整一分钟。

我尝试配置自定义范围,并实现了 Spring 侦听器...我在每个测试方法之后重置了我的 Person Bean... 但是,这只适用于类级别,它不会在 @Test 范围之间给我一个新的 Person 对象。

谢谢,如果您需要更多代码来澄清,请告诉我。

【问题讨论】:

    标签: java spring selenium testing testng


    【解决方案1】:

    取决于您使用的框架。但无论如何,您需要一个范围为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 与页面对象共享。问题标题虽然是关于webdriver。如果您使用的类似页面对象的框架也具有指向webdriver 的链接,那么您将使用与其余代码不同的 web 驱动程序。这根本行不通。此外,webdriver 很少用于测试本身——它通常被业务层或页面对象层完全隐藏。阅读this article了解详情。如果您需要一个新的 webdriver 实例,请准备好重新创建许多其他对象。

    您可以实现自己的 Spring 范围或为所有测试 bean 使用类似 thread 的范围,并在其自己的线程中运行每个方法(TestNG 允许这样做)。但这会很复杂,并且性能很差,因为创建新的webdriver 会话意味着启动一个非常昂贵的新浏览器。

    【讨论】:

      猜你喜欢
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 2011-02-19
      相关资源
      最近更新 更多