users@jersey.java.net

[Jersey] Re: Unit Testing with Spring

From: Colin Vipurs <zodiaczx6_at_gmail.com>
Date: Thu, 13 Jan 2011 09:42:02 +0000

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.