Не удалось создать экземпляр TestExecutionListener
Когда я запускаю свой тест selenium ниже из Eclipse, я получаю серию сообщений 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.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
.
Одно решение, три дополнительных зависимостей
Я заметил в ответе на предыдущий вопрос предложение добавить @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 - это просто тест селена с некоторой моей собственной конфигурацией.
Есть ли более простой способ? Я пропустил нечто большее?
Класс конфигурации
Это класс, с которым я настраиваю свои тесты.
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>
Ответы
Ответ 1
Если я оставлю в трех дополнительных зависимостях
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
Ошибок нет, но, очевидно, 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.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
.
Ответ 2
Чтобы оставаться рядом с исходной реализацией 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.
Ответ 3
По крайней мере, для моей установки с использованием TestNG первоначальный ответ был недостаточно. Мне пришлось добавить следующую аннотацию:
@TestExecutionListeners(inheritListeners = false, listeners =
{DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class})
Ответ 4
Любые сообщения INFO типа:
Не удалось создать экземпляр TestExecutionListener org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener]
Можно безопасно игнорировать, если вы не используете или не проверяете JDBC или связанные с WEB функции spring. Это всего лишь сообщение INFO, в котором сообщается, что spring не активировал этих слушателей, поскольку необходимые зависимости (зависимости pom) не были добавлены. Что хорошо, если вы не используете эти функции.
Однако, скажем, вы используете @Sql для загрузки некоторых тестовых данных в базу данных. И вы видите это предупреждение. Затем нам нужно связать требуемые зависимости (spring-jdbc
с областью тестирования в вашем проекте pom.xml
), чтобы для требуемого прослушивателя (SqlScriptsTestExecutionListener
в этом случае) для активации с помощью Spring