在使用EasyMock测试我的Spring类时,我来到了以下场景:
我的Spring配置采用Spring component-scan
配置的原始DAO对象,而不是我的模拟DAO对象。
请在下面找到我的模拟,AppContext和测试类:
ApplicationContxt-的test.xml
<context:annotation-config />
<context:component-scan base-package="com.test.testclasses"/>
<import resource="mockServices.xml" />
MockServices.xml
<bean class="org.easymock.EasyMock" factory-method="createMock"
id="codeDAO" primary="true" >
<constructor-arg value="com.test.testclasses.dao.MaintainCodeDAO" />
</bean>
JUnit类:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:ApplicationContxt-Test.xml")
public class MaintainCodeServiceImplTest {
@Autowired
private MaintainCodeDAO codeDAO;
@Autowired
private MaintainCodeService maintainCodeService;
@Before
public void setUp() {
EasyMock.reset(codeDAO);
}
@After
public void tearDown() {
EasyMock.reset(codeDAO);
}
@Test
public void shouldAutowireDependencies() {
assertNotNull(codeDAO);
assertNotNull(maintainCodeService);
}
@Test
public void getProcedureByCode_success() throws Exception {
MaintainCodeVO maintainCodeVO = new MaintainCodeVO();
EasyMock.expect(codeDAO.searchProcedureCode(isA(String.class))).andReturn(maintainCodeVO);
EasyMock.replay(codeDAO);
MaintainCodeBO maintainCodeResult = maintainCodeService.getProcedureByCode("test");
EasyMock.verify(codeDAO);
codeDAO.searchProcedureCode("test");
assertNotNull(maintainCodeResult);
EasyMock.reset(codeDAO);
}
}
这里我模仿codeDAO
并且在测试服务类时,而不是模拟codeDAO
,原始DAO对象正在自动装配,EasyMock.verify()
抛出异常。不知道这是什么问题。上述配置有问题吗?
答案 0 :(得分:2)
我找到了解决方案。诀窍很简单..我有一天找到了解决方案... 所以这是解决方案:
只需在上下文中移动mockServices.xml(仅使用模拟配置的spring xml):component-scan ...
<import resource="mockServices.xml" />
<context:annotation-config />
<context:component-scan base-package="com.wellpoint.icnotes"/>
像魅力一样工作。
答案 1 :(得分:-1)
如果我没记错的话,因为createMock
是一个通用方法,Spring在推断bean类型时不能正常工作,它推断它为Object
,因此无法连接。我建议不要在单元测试中使用Spring,使用简单的类。
可以将模拟放入上下文中,例如如下所述:Autowiring of beans generated by EasyMock factory-method?但对我来说这不是最好的方法,看起来很笨拙。
答案 2 :(得分:-1)
如果您使用的是Spring Framework 4.2或更高版本,则应该可以使用。有关详细信息,请参阅以下相关问题。