Spring unit test objects autowired with null fields

纵饮孤独 提交于 2021-02-11 08:49:35

问题


I'm attempting to create unit tests for a rest service in my spring servlet. But when the controller object is created by @autowire, then all of its @autowired fields are null.

My test class is as follows, using the SpringJUnit runner and context configuration set

@ContextConfiguration(locations = "ExampleRestControllerTest-context.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class ExampleRestControllerTest {

    @Autowired
    private BaseService mockExampleService;

    @Autowired
    private ExampleRestController testExampleRestController;

The ExampleRestControllerTest-context.xml sets up the service to be mocked and injects the mocked object into the controller

<context:annotation-config/>

<import resource="classpath*:example-servlet.xml"/>

<bean id="mockExampleService" class="org.easymock.EasyMock" factory-method="createMock">
    <constructor-arg index="0" value="za.co.myexample.example.services.BaseService"/>
</bean>
<bean id="testExampleRestController" class="za.co.myexample.example.rest.controller.ExampleRestController">
    <property name="exampleService" ref="mockExampleService"/>
</bean>

The rest of the beans used by the controler are defined in the example-servlet.xml

<bean id="RESTCodeMapper" class="za.co.myexample.example.rest.util.RESTCodeMapper"/>

<bean id="restProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="location" value="classpath:RESTServiceCodeMapping.properties"/>
</bean>

Along with my Jax2BMarshaller.

My IDE links to these definitions just fine and if I remove any of the definitions I get an "No qualifying bean" error as expected.

My problem is that when I run my unit tests the controller that is provided has all of its fields as nulls

@Controller
public abstract class BaseRestController {

    private static Logger LOGGER = Logger.getLogger(BaseRestController.class);
    protected final String HEADERS = "Content-Type=application/json,application/xml";
    @Autowired
    protected RESTCodeMapper restCodeMapper;

    @Autowired
    protected BaseService exampleService;

    @Autowired
    protected Jaxb2Marshaller jaxb2Marshaller;

(and its implementing class)

@Controller
@RequestMapping("/example")
public class ExampleRestController extends BaseRestController {

When I run the proper code in my Weblogic server the fields get properly populated. More so if I add these fields in my test class directly those fields also get @autowired correctly. I could thus @autowire those objects in my test class and then set them directly into my controller. But that's not the right way of doing it.

So the question is, why are the autowired fields of an autowired object null in my test class when it autowires those objects directly in the same test class or if I run the code normally on my Weblogic server.


回答1:


In your test class, the @Autowired objects are null because of context configuration, so change it to:

@ContextConfiguration(locations = "ExampleRestControllerTest-context.xml")

to

@ContextConfiguration(locations = "classpath:/ExampleRestControllerTest-context.xml")

in ExampleRestControllerTest

So the question is, why are the autowired fields of an autowired object null in my test class when it autowires those objects directly in the same test class or if I run the code normally on my Weblogic server.

They must be null in autowired objects' constructor. You can try to create @PostConstruct method in autowired object and in this method the autowired objects must be not null



来源:https://stackoverflow.com/questions/31046360/spring-unit-test-objects-autowired-with-null-fields

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!