EasyMock - Spring采用原始对象而不是模拟对象

时间:2016-06-03 13:34:05

标签: unit-testing junit easymock spring-test

在使用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()抛出异常。不知道这是什么问题。上述配置有问题吗?

3 个答案:

答案 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,使用简单的类。

顺便说一下,EasyMock有它自己的DI,只需使用它:http://easymock.org/user-guide.html#mocking-annotations

可以将模拟放入上下文中,例如如下所述:Autowiring of beans generated by EasyMock factory-method?但对我来说这不是最好的方法,看起来很笨拙。

答案 2 :(得分:-1)

如果您使用的是Spring Framework 4.2或更高版本,则应该可以使用。有关详细信息,请参阅以下相关问题。