I am posting this question given I haven't found any relevant answer so far. I could not figure out how to run integration tests using Spring-Dynamic Modules.
Problem Definition
Template Application
- One OSGi bundle containing the business logic. Using Spring DM to export / reference some services
- One OSGi fragment for the Integration Tests. Tests should be able to inject helper test beans which are defined in the fragment Application Context (using xml files under META-INF/spring) as well as OSGi services exported (from the API bundle)
Versions
- OSGi 3.6
- Spring Framework 3.1.0
- Spring Dynamic Modules 1.2.1
Question
- How can I run Integration Test which would be aware of the Spring Application Context and of the exposed OSGi services?
Using
@RunWith(SpringJUnit4ClassRunner.class)
and@ContextConfiguration(locations = { "classpath:META-INF/spring/context.xml" })
leads to aFileNotFoundException
regarding context.xml, which exists... DebuggingXmlBeanDefinitionReader
confirmed my doubts:SpringJUnit4ClassRunner
is trying to load the Application Context from its OSGi classpath, and cannot access my Bundle Resources.
How would you best solve this please?
I do appreciate your help in advance.
ps: I had a look at Spring DM Test but did not find anything relevant.
Example
Bundle Manifest
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: HelloWorldDM
Bundle-SymbolicName: HelloWorldDM
Bundle-Version: 1.0.0.qualifier
Require-Bundle: org.eclipse.core.runtime,
ContactDAO;bundle-version="1.0.0",
org.springframework.osgi.extensions.annotations;bundle-version="1.2.1"
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Import-Package: ch.xxx.test.contact
Integration Test Fragment Manifest
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: HelloWorldTest
Bundle-SymbolicName: HelloWorldTest
Bundle-Version: 1.0.0.qualifier
Fragment-Host: HelloWorldDM;bundle-version="1.0.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Require-Bundle: org.junit4;bundle-version="4.8.1",
org.springframework.spring-test;bundle-version="3.1.0",
org.springframework.spring-context;bundle-version="3.1.0",
org.springframework.spring-beans;bundle-version="3.1.0",
org.springframework.osgi.test;bundle-version="1.2.1",
org.springframework.spring-core;bundle-version="3.1.0"
Fragment Application Context
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<bean class="org.springframework.osgi.extensions.annotation.ServiceReferenceInjectionBeanPostProcessor"/>
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
</beans>
Test Class
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:META-INF/spring/context.xml" })
public class TestCase {
private BitemporalityService bitemporalityService;
@ServiceReference
public void setBitemporalityService(BitemporalityService service) {
this.bitemporalityService = service;
}
@Test
public void dummy(){
System.err.println("in Test: ");
assertNotNull(bitemporalityService);
}
}