2

我使用 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();
    }

}

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

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

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

谢谢

编辑:

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

4

2 回答 2

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接口的类。但其中一个是主要的,它将被选择用于自动装配。而已!

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

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

  @Autowired
  private IService iServiceMock;
于 2012-08-31T16:48:23.037 回答
1

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

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

或者:

@Test
public void test() {
    Controller controller = new Controller();
    controller.afterPropertiesSet();
}
于 2012-08-31T17:46:21.600 回答