SpringTest和afterPropertiesSet

时间:2012-08-31 16:10:29

标签: spring easymock spring-test

我使用SpringTest和EasyMock对我的Spring bean进行单元测试。

我的测试bean是这样的:

    @ContextConfiguration(locations = "classpath:/test/applicationContext-test.xml")
    public class ControllerTest {

        @Autowired
        private Controller controller;

        @Autowired
        private IService service;

        @Test
        public void test() {
        }
}

这是我的控制器:

@Controller
@Scope("request")
public class Controller implements InitializingBean {

    @Autowired
    private IService service;

    void afterPropertiesSet() throws Exception {
        service.doSomething();
    }

}

Spring初始化bean时会自动调用afterPropertiesSet方法。我想用EasyMock模拟调用doSomething方法。

我想在我的测试方法中执行此操作但是在执行myPropertiesSet之前执行我的测试方法,因为Spring在初始化bean时会调用它。

如何使用SpringTest或EasyMock模拟afterPropertiesSet方法中的服务?

由于

修改

我指定模拟服务在Spring中正确加载到我的Controller中。我的问题不是如何创建模拟(它已经可以)但是如何模拟方法。

2 个答案:

答案 0 :(得分:2)

你没有提供足够的细节,所以我会给你一个Mockito的例子。将此IService模拟配置添加到applicationContext-test.xml文件的开头

<bean 
      id="iServiceMock"
      class="org.mockito.Mockito" 
      factory-method="mock"
      primary="true">
  <constructor-arg value="com.example.IService"/>
</bean>

注意到primary="true"属性? Spring现在将找到两个实现IService接口的类。但其中一个是 primary ,它将被选择用于自动装配。就是这样!

想要记录或验证某些行为?只需将此模拟注入您的测试:

@ContextConfiguration(locations = "classpath:/test/applicationContext-test.xml")
public class ControllerTest {

  @Autowired
  private IService iServiceMock;

答案 1 :(得分:1)

不要@Autowire您的控制器,而是在测试中以编程方式对其进行实例化,手动设置模拟服务。

@Test
public void test() {
    Controller controller = new Controller();
    controller.setMyService(mockService);
}

或:

@Test
public void test() {
    Controller controller = new Controller();
    controller.afterPropertiesSet();
}