当前位置: 首页 > 知识库问答 >
问题:

Spring单元测试对象与空字段自动关联

田谦
2023-03-14

我正在尝试为我的服务创建一个servlet测试。但当控制器对象由@autowire创建时,其所有@autowired字段都为空。

我的测试类如下,使用SpringJUnit运行器和上下文配置集

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

    @Autowired
    private BaseService mockExampleService;

    @Autowired
    private ExampleRestController testExampleRestController;

est-context.xml设置要mocked的服务,并将mocked对象注入控制器

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

还有我的马歇尔。

我的IDE链接到这些html" target="_blank">定义很好,如果我删除任何定义,我会得到一个“无限定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服务器上正常运行代码。

共有1个答案

微生德运
2023-03-14

测试类中,@Autowired对象由于上下文配置而为空,因此将其更改为:

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

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

ExampleRestControllerTest

所以问题是,为什么自动装配对象的自动装配字段在我的测试类中为空,当它直接在同一个测试类中自动装配这些对象时,或者如果我在我的Weblogic服务器上正常运行代码。

在autowired对象的构造函数中,它们必须为null。您可以尝试在autowired对象中创建@PostConstruct方法,并且在该方法中,autowired对象必须不为null

 类似资料:
  • 我的“BBService”对象在这里为空 我是不是漏掉了什么?

  • 我有一个简单的类,它包含一个列表: 关键是-我希望该列表只从DB加载一次。我想对这个功能进行单元测试。我是TDD的新手,我所能做的就是为某些列表编写一个公共getter和setter,并在单元测试中使用它们。但这在概念上是错误的--我不希望类的客户端直接使用这个成员变量。 在这种情况下,我如何正确地测试方法?

  • 我正在使用jUnit 5为我的Spring引导服务类做单元测试。在服务类中,我是自动装配对象,用于调用其他类中的方法。在测试用例中,@Mock没有为@Autow的类创建对象。在这里,我给出了我的代码。 我的服务级别: 我的组件类 : 我的单元测试类: pom.xml 文件 : 在运行此测试时,我在imageProcessor.dummy(name)中获得空指针异常;

  • 遇到了另一个常见的问题,同时为Spring Batch编写单元测试和集成测试组件是如何模拟域对象。一个很好的例子是StepExecutionListener,如下所示: public class NoWorkFoundStepExecutionListener extends StepExecutionListenerSupport { public ExitStatus afterSte

  • 问题内容: 有什么工具可以自动生成 Java 代码的单元测试? 更新: 主要用途是为将要重构的遗留代码快速生成单元测试。自动生成后,无需自动使测试与代码保持同步。 在这里提出了几乎相同的问题,但是答案是.NET而不是Java(Pex是公认的答案): 问题答案: CodePro Analytix有一个JUnit测试生成模块,听起来像它可以完成您想要的。请参阅《用户指南》。 [CoView]是价格合理