Java – cannot instantiate testexecutionlistener
When I run the following test from eclipse, I get a series of messages that cannot instantiate testexecutionlistener in my log
This is an actual test
@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!"); } }
This is the log
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
Note that I am using spring 4.1 0.RELEASE.
One solution, three additional dependencies
I noticed the suggestion to add @ webappconfiguration in answer to a previous question
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = SeleniumConfig.class) @WebAppConfiguration public final class TestWebpage {
Then I'm in my POM Three additional dependencies are required in XML to support:
javax.servlet-api spring-jdbc spring-web
Why do I not use JDBC at all, or anything that uses spring Web / servlet, need these extra things - this is just a test I configured myself
Is there a simpler way? Did I miss something bigger?
Configuration class
This is the class where I configure my tests
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
My POM XML (before I add additional dependencies)
<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>
Solution
If I leave three additional dependencies
javax.servlet-api spring-jdbc spring-web
I can define my test class as:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = SeleniumConfig.class) public final class TestWebpage {
I will get this log:
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.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
No mistake, but obviously, spring is doing some pretty work backstage
Alternatively, I can remove three additional dependencies and add this minimal @ testexecutionlisteners annotation
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = SeleniumConfig.class) @TestExecutionListeners(listeners = {DependencyInjectionTestExecutionListener.class}) public final class TestWebpage {
My records are as follows:
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
At least there are no mistakes
As for why I need these, I don't understand I'll use it here as a reference to show at least the minimum changes needed to get rid of the inability to instantiate the testexecutionlistener message