2014-09-30 4 views
10

Когда я запускаю свой тест selenium ниже из Eclipse, я получаю серию сообщений Could not instantiate TestExecutionListener в моем журнале.Не удалось создать экземпляр 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.springframewor[email protected]152c95a3, org.springfra[email protected]22140b31] 
127 [main] INFO org.springframework.context.support.GenericApplicationContext - Refreshing [email protected]523de0: 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 [email protected]523de0: 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 - это просто селе nium с некоторыми из моих собственных конфигураций.

Есть ли более простой способ? Я что-то не хватает?

Config класса

Это класс я устанавливаю мои тесты с.

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> 

ответ

15

Если я уеду в трех дополнительных зависимостей

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: [or[email protected]3997ebf6, org.springframewor[email protected]25048104, org.springfra[email protected]4ab24098, org.springframew[email protected]7caee177, org.sp[email protected]3d548b94] 
132 [main] INFO org.springframework.context.support.GenericApplicationContext - Refreshing [email protected]55137: 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 [email protected]55137: startup date [Wed Oct 01 21:55:02 EST 2014]; root of context hierarchy 

Ошибок нет, но obviou Ужасная Весна делает небольшую работу в фоновом режиме.

В качестве альтернативы, я могу удалить три дополнительные зависимости и добавить эту минимальную аннотацию @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.springframewor[email protected]4fce6eaf] 
117 [main] INFO org.springframework.context.support.GenericApplicationContext - Refreshing [email protected]695958: 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 [email protected]695958: startup date [Wed Oct 01 21:59:05 EST 2014]; root of context hierarchy 

по крайней мере, без ошибок.

Что касается того, зачем мне это нужно, я пока не понимаю. Я оставляю это здесь как ссылку, по крайней мере, чтобы показать минимальные изменения, необходимые, чтобы избавиться от сообщений Could not instantiate TestExecutionListener.

+1

Приятный ответ, было бы неплохо, если бы бит '' TestExecutionListeners был первым, поскольку я считаю, что это реальный (чистый) ответ. –

4

По крайней мере, для моей установки с использованием TestNG первоначального ответа было недостаточно. Я должен был добавить следующее примечание:

@TestExecutionListeners(inheritListeners = false, listeners = 
    {DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class}) 
5

остаться близко к первоначальной реализации Spring, используйте вместо этого:

@TestExecutionListeners(listeners = { DependencyInjectionTestExecutionListener.class, 
    DirtiesContextTestExecutionListener.class, TransactionalTestExecutionListener.class }) 

, как это определено в org.springframework.test.context.TestContextManager:

private static final String[] DEFAULT_TEST_EXECUTION_LISTENER_CLASS_NAMES = new String[] { 
     "org.springframework.test.context.web.ServletTestExecutionListener", 
     "org.springframework.test.context.support.DependencyInjectionTestExecutionListener", 
     "org.springframework.test.context.support.DirtiesContextTestExecutionListener", 
     "org.springframework.test.context.transaction.TransactionalTestExecutionListener" }; 

Необходимо удалить только ServletTestExecutionListener.

4

Любые информационные сообщения, как:

Не удалось создать экземпляр TestExecutionListener org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener]

можно смело игнорировать, если вы не используете или тестирования JDBC или Связанные с WEB функции весны. Это всего лишь сообщение INFO, сообщающее нам, что Spring не активировал этих слушателей, поскольку требуемые зависимости (pom dependencies) не были добавлены. Это нормально, если вы не используете эти функции.

Однако позволяет сказать, что вы используете @sql загрузить некоторые тестовые данные в базу данных, и вы видите это предупреждение, то мы должны провода в требуемых зависимости (spring-jdbc с тестовой сферой в проекте pom.xml) для того, чтобы искомого слушатель (SqlScriptsTestExecutionListener в этом случае), который должен быть активирован весной

Смежные вопросы