我使用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中。我的问题不是如何创建模拟(它已经可以)但是如何模拟方法。
答案 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();
}