This is something I tried to do a while back and this is what I came
up with. It seems neater than the solution in the link but it's not
been battle hardened yet.
public class MyIntegrationTest extends JerseyTest {
private MockService mockService;
@Override
protected AppDescriptor configure() {
mockService = new MockService();
MockableContext.addMock("myService", mockService);
return new WebAppDescriptor.Builder("com.shazam.rest")
.contextPath("/root")
.contextParam("contextConfigLocation", "classpath:applicationContext.xml")
.contextParam("contextClass", "com.company.MockableContext")
.servletClass(SpringServlet.class)
.contextListenerClass(ContextLoaderListener.class)
.requestListenerClass(RequestContextListener.class)
.build();
}
}
public class MockableContext extends XmlWebApplicationContext {
private static Map<String, Object> mocks = new HashMap<String, Object>();
@Override
protected DefaultListableBeanFactory createBeanFactory() {
return new MockableBeanFactory();
}
private class MockableBeanFactory extends DefaultListableBeanFactory {
@Override
public Object getBean(String name) throws BeansException {
Object obj = mocks.get(name);
if (obj != null) {
return obj;
}
return super.getBean(name);
}
}
public static void addMock(String id, Object mock) {
mocks.put(id, mock);
}
public static void reset() {
mocks.clear();
}
}
On Wed, Jan 12, 2011 at 1:22 PM, Jonathan Cook - FM&T
<Jonathan.Cook2_at_bbc.co.uk> wrote:
> That was it :)
>
> Now I would like to be able to mock out that autowired bean. I came across
> this but it looks like a bit of work, is there anything neater?
> http://jersey.576304.n2.nabble.com/unit-test-a-jersey-resource-with-mocked-spring-beans-td581233.html
>
> Thanks
>
>
> On 12/01/2011 12:33, "Jonathan Cook - FM&T" <Jonathan.Cook2_at_bbc.co.uk>
> wrote:
>
> Just read this:
> http://jersey.576304.n2.nabble.com/Jersey-test-and-Spring-td5607651.html
>
> Perhaps that is the reason?
>
> Thanks
>
>
> On 12/01/2011 12:28, "Jonathan Cook - FM&T" <Jonathan.Cook2_at_bbc.co.uk>
> wrote:
>
> Hi,
>
> I have the following simple example unit test:
>
> public class TableResourceTest extends JerseyTest {
>
> public TableResourceTest() throws Exception {
> super(new WebAppDescriptor.Builder("bbc.forge.statsapi")
> .contextPath("football")
> .contextParam("contextConfigLocation",
> "classpath:applicationContext.xml")
> .contextParam("log4jConfigLocation",
> "classpath:log4j.properties")
> .contextParam("propertiesConfigLocation",
> "classpath:propertiesConfigContext.xml")
> .contextListenerClass(ContextLoaderListener.class)
> .requestListenerClass(RequestContextListener.class)
> .servletClass(SpringServlet.class).build());
> }
>
> @Test
> public void testTable() throws Exception {
>
> WebResource webResource = resource();
> String responseMsg =
> webResource.path("/football/table/competition/100").get(String.class);
> Assert.assertEquals("Some Text", responseMsg);
> }
> }
>
> However on running the test I get a NullPointerException. The resource I am
> invoking has an AutoWired property which is in the applicationContext.xml.
> But it appears the http container isn’t initialising spring at all. I’m not
> really sure why. I have looked through some of the samples such as
> spring-annotations and it doesn’t appear to be any different.
>
> The container is initialising the resources ok so I wasn’t sure why it
> wasn’t picking up the applicationContext.xml. Or maybe it is and this
> doesn’t work with autowiring?
>
> INFO: Scanning for root resource and provider classes in the packages:
> bbc.forge.statsapi
> Jan 12, 2011 12:19:55 PM com.sun.jersey.api.core.ScanningResourceConfig
> logClasses
> INFO: Root resource classes found:
>
> Thanks
> Jon
>
--
Maybe she awoke to see the roommate's boyfriend swinging from the
chandelier wearing a boar's head.
Something which you, I, and everyone else would call "Tuesday", of course.