簡體   English   中英

使用空字段自動連線的Spring單元測試對象

[英]Spring unit test objects autowired with null fields

我試圖在我的spring servlet中為rest服務創建單元測試。 但是,當控制器對象由@autowire創建時,則其所有@autowired字段均為空。

我的測試類如下,使用SpringJUnit運行器和上下文配置集

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

    @Autowired
    private BaseService mockExampleService;

    @Autowired
    private ExampleRestController testExampleRestController;

ExampleRestControllerTest-context.xml設置要模擬的服務,並將模擬的對象注入控制器

<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>

控制器使用的其余bean在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>

和我的Jax2BMarshaller一起。

我的IDE可以很好地鏈接到這些定義,並且如果刪除任何定義,都會收到“沒有合格的bean”的錯誤消息。

我的問題是,當我運行單元測試時,提供的控制器的所有字段都為空

@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;

(及其實現類)

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

當我在Weblogic服務器中運行正確的代碼時,將正確填充字段。 更重要的是,如果我直接在測試類中添加這些字段,那么這些字段也會正確獲得@autowired。 因此,我可以@autowire測試類中的那些對象,然后將它們直接設置到控制器中。 但這不是正確的方法。

所以問題是,當自動連線對象直接在同一測試類中自動連線對象時,為什么自動連線對象的自動連線字段在我的測試類中為空,或者我是否在Weblogic服務器上正常運行代碼。

在測試類中,由於上下文配置,@ Autowired對象為空,因此請將其更改為:

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

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

ExampleRestControllerTest

所以問題是,當自動連線對象直接在同一測試類中自動連線對象時,為什么自動連線對象的自動連線字段在我的測試類中為空,或者我是否在Weblogic服務器上正常運行代碼。

在自動裝配對象的構造函數中,它們必須為null。 您可以嘗試在自動裝配對象中創建@PostConstruct方法,在這種方法中,自動裝配對象不能為null

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM