java - 无法实例化 TestExecutionListener

标签 java spring selenium-webdriver

当我在 Eclipse 中运行下面的 selenium 测试时,我在日志中收到一系列 Could not instantiate TestExecutionListener 消息。

这是实际测试。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SeleniumConfig.class)
public final class TestWebpage {
   private static final Logger LOG = Logger.getLogger(TestWebpage.class);

   @Autowired
   private WebDriver driver;

   @Test
   public void testLoadingPage() {
      LOG.debug("Hello World!");
   }
}

这是日志

0    [main] INFO  org.springframework.test.context.support.DefaultTestContextBootstrapper  - Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener]
5    [main] INFO  org.springframework.test.context.support.DefaultTestContextBootstrapper  - Could not instantiate TestExecutionListener [org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener]. Specify custom listener classes or make the default listener classes (and their required dependencies) available. Offending class: [org/springframework/transaction/interceptor/TransactionAttribute]
6    [main] INFO  org.springframework.test.context.support.DefaultTestContextBootstrapper  - Could not instantiate TestExecutionListener [org.springframework.test.context.transaction.TransactionalTestExecutionListener]. Specify custom listener classes or make the default listener classes (and their required dependencies) available. Offending class: [org/springframework/transaction/interceptor/TransactionAttributeSource]
7    [main] INFO  org.springframework.test.context.support.DefaultTestContextBootstrapper  - Could not instantiate TestExecutionListener [org.springframework.test.context.web.ServletTestExecutionListener]. Specify custom listener classes or make the default listener classes (and their required dependencies) available. Offending class: [javax/servlet/ServletContext]
8    [main] INFO  org.springframework.test.context.support.DefaultTestContextBootstrapper  - Using TestExecutionListeners: [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@152c95a3, org.springframework.test.context.support.DirtiesContextTestExecutionListener@22140b31]
127  [main] INFO  org.springframework.context.support.GenericApplicationContext  - Refreshing org.springframework.context.support.GenericApplicationContext@35523de0: startup date [Wed Oct 01 01:20:22 EST 2014]; root of context hierarchy
3961 [main] DEBUG org.rmb.selenium.external.TestWebpage  - Hello World!
3963 [Thread-8] INFO  org.springframework.context.support.GenericApplicationContext  - Closing org.springframework.context.support.GenericApplicationContext@35523de0: startup date [Wed Oct 01 01:20:22 EST 2014]; root of context hierarchy

请注意,我使用的是 Spring 4.1.0.RELEASE

一个解决方案,三个额外的依赖项

我注意到 answer to a previous question添加 @WebAppConfiguration

的建议
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SeleniumConfig.class)
@WebAppConfiguration
public final class TestWebpage {

然后我需要在我的 pom.xml 中添加三个额外的依赖项来支持:

javax.servlet-api
spring-jdbc
spring-web

当我根本不使用 JDBC 或使用 spring-web/servlet 的任何东西时,为什么我需要所有这些额外的东西 - 这只是一个带有我自己配置​​的 selenium 测试。

有没有更简单的方法?我错过了更大的东西吗?

配置类

这是我用来配置测试的类。

public final class SeleniumConfig {

   @Bean
   public String baseUrl() {
      return "http://localhost:8888/";
   }

   @Bean
   public WebDriver driver() {
      return new CloseableFirefoxDriver();
   }

   class CloseableFirefoxDriver extends FirefoxDriver implements DisposableBean {
      public void destroy() throws Exception {
         quit();
      }
   }
}

POM

我的 pom.xml(在我添加额外的依赖项之前)。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>WebAppWithSeleniumTest</groupId>
   <artifactId>WebAppWithSeleniumTest</artifactId>
   <packaging>war</packaging>
   <version>0.0.1-SNAPSHOT</version>
   <name>WebAppWithSeleniumTest Maven Webapp</name>
   <url>http://maven.apache.org</url>
   <dependencies>
      <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>4.11</version>
      </dependency>
      <dependency>
         <groupId>log4j</groupId>
         <artifactId>log4j</artifactId>
         <version>1.2.16</version>
      </dependency>
      <dependency>
         <groupId>org.seleniumhq.selenium</groupId>
         <artifactId>selenium-java</artifactId>
         <version>2.43.1</version>
      </dependency>
      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-test</artifactId>
         <version>${spring.version}</version>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-context</artifactId>
         <version>${spring.version}</version>
      </dependency>
   </dependencies>
   <build>
      <finalName>WebAppWithSeleniumTest</finalName>
      <resources>
         <resource>
            <directory>src/main/resources</directory>
            <targetPath>${basedir}/target/classes</targetPath>
            <includes>
               <include>log4j.properties</include>
            </includes>
         </resource>
      </resources>
   </build>
   <description>Web App with Selenium Tests - a base</description>
   <properties>
      <spring.version>4.1.0.RELEASE</spring.version>
   </properties>
</project>

最佳答案

如果我留下三个额外的依赖项

javax.servlet-api
spring-jdbc
spring-web

我可以这样定义我的测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SeleniumConfig.class)
public final class TestWebpage {

我会得到这个记录:

0    [main] INFO  org.springframework.test.context.support.DefaultTestContextBootstrapper  - Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener]
20   [main] INFO  org.springframework.test.context.support.DefaultTestContextBootstrapper  - Using TestExecutionListeners: [org.springframework.test.context.web.ServletTestExecutionListener@3997ebf6, org.springframework.test.context.support.DependencyInjectionTestExecutionListener@25048104, org.springframework.test.context.support.DirtiesContextTestExecutionListener@4ab24098, org.springframework.test.context.transaction.TransactionalTestExecutionListener@7caee177, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@3d548b94]
132  [main] INFO  org.springframework.context.support.GenericApplicationContext  - Refreshing org.springframework.context.support.GenericApplicationContext@6f55137: startup date [Wed Oct 01 21:55:02 EST 2014]; root of context hierarchy
4183 [main] DEBUG org.rmb.selenium.external.TestWebpage  - Hello World!
4186 [Thread-8] INFO  org.springframework.context.support.GenericApplicationContext  - Closing org.springframework.context.support.GenericApplicationContext@6f55137: startup date [Wed Oct 01 21:55:02 EST 2014]; root of context hierarchy

没有错误,但显然 Spring 在后台做了相当多的工作。

或者,我可以删除三个额外的依赖项并添加这个最小的 @TestExecutionListeners 注释。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SeleniumConfig.class)
@TestExecutionListeners(listeners = {DependencyInjectionTestExecutionListener.class})
public final class TestWebpage {

我得到如下记录:

0    [main] INFO  org.springframework.test.context.support.DefaultTestContextBootstrapper  - Using TestExecutionListeners: [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@4fce6eaf]
117  [main] INFO  org.springframework.context.support.GenericApplicationContext  - Refreshing org.springframework.context.support.GenericApplicationContext@42695958: startup date [Wed Oct 01 21:59:05 EST 2014]; root of context hierarchy
4189 [main] DEBUG org.rmb.selenium.external.TestWebpage  - Hello World!
4190 [Thread-8] INFO  org.springframework.context.support.GenericApplicationContext  - Closing org.springframework.context.support.GenericApplicationContext@42695958: startup date [Wed Oct 01 21:59:05 EST 2014]; root of context hierarchy

至少没有错误。

至于为什么我需要这些,我还不明白。我把它留在这里作为引用,至少显示摆脱 Could not instantiate TestExecutionListener 消息所需的最小更改。

关于java - 无法实例化 TestExecutionListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26125024/

相关文章:

java - 尝试输出数学方程的解总是结果为 0

java - 如何实现按返回两次退出所有 Activity

java - Spring 框架项目未加载?

java - Spring AMQP 手动容器异常缓慢

spring - 写粗麻布服务

Spring消息监听器/手动确认

java - 使用 Selenium IE webdriver 和 JAVA 识别特定字符串后面的文本

java - 为什么 swing 会绘制两次简单的组件?

java - 如何在selenium java中识别 'mat-calendar-body-cell'?

selenium - 如何在 Safari (MAC) 的 webdriver 中上传文件