Martin
Martin

Reputation: 215

how to run test in spring mvc

I'm trying to run some tests for my controller but somehow the @Autowire annotation is not working.

Here is what I'm trying to do:

@WebAppConfiguration
@ContextConfiguration("/WEB-INF/spring/app-config.xml")
public class ClientsTest {

    private Client client = new Cliente();

    @Test
    public void test() {

        BindingResult result = mock(BindingResult.class);
        ClientController clientController = new ClientController();
        ModelAndView model = clientController.regClient(client, result);
        Assert.assertEquals("success", model.getViewName());

    }
}

@Controller
public class ClientController {

    @Autowired private ClientService clientService;

    @RequestMapping(value="/regClient.html", method = RequestMethod.POST)
    public ModelAndView regClient(@ModelAttribute("client") @Valid Client client, BindingResult result){

        ModelAndView model = new ModelAndView();

        if(result.hasErrors())
        {
            model.setViewName("error");
        }
        else
        {
            model = clientService.regClient(client);
            model.setViewName("success");
        }

        return model;
    }
}

<?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"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">

       <!-- Scans the classpath of this application for @Components to deploy as beans -->
       <context:component-scan base-package="com.app.app_v2.web" />

       <!-- Configures the @Controller programming model -->
       <mvc:annotation-driven conversion-service="conversionService"/>

       <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
            <property name="basenames">
                <list>
                    <value>client</value>
                </list>
            </property>
       </bean>

       <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
            <property name="formatters">
                <set>
                    <ref bean="clientFormatter"/>
                </set>
            </property>
       </bean>

       <bean id="clientFormatter" class="com.app.app_v2.spring.ClientFormatter"/>

       <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
            <property name="prefix" value="/WEB-INF/views/"></property>
            <property name="suffix" value=".jsp"></property>        
       </bean>

       <bean id="clientService" class="com.app.app_v2.services.ClientService"/>

</beans>

As far as I know the clientService is null and this is why I'm getting the exception. Because I don't know much about running test I'm asking for your help.

Upvotes: 0

Views: 611

Answers (1)

Master Slave
Master Slave

Reputation: 28519

Your immediate problem about @Autowire not working is related to the fact that you're explicitly instantiating the clientController, and not through Spring framework. If you want the class to be a Spring bean you need to let the Spring framework manage its lifecycle, only than the dependency injection will kick-in, and all the spring beans annotated with @Autowire will be injected. Moreover, the test should be run with spring runner SpringJUnit4ClassRunner

Note that this is not necessary, cause with your test you can go two ways. More towards unit testing, by mocking your clientService e.g. via EasyMock or Mockito. Your currently posted test looks more geared towards that way. To learn how to complete your test take a look at this blog post

On the other hand, you can go for an integration test. Since version 3.2 Spring MVC offers test module which should really be the way to write integration test against Spring MVC. You can follow a great blog series backed with source code to learn how to do it.

Upvotes: 1

Related Questions