如何使用EasyMock模拟方法

时间:2014-06-19 09:14:54

标签: java unit-testing mocking easymock

User getUser(int id) {
    User user = service.get( id );
    if( user != null ) {
        user.Stuff = getUserStuff( id );
        return User;
    }

    throw new NotFoundException();
}

Stuff getUserStuff( int id ) {
    stuffGetter.getStuff( id ); // stuff getter makes a rest call
    return Stuff;
}

使用EasyMock,我将如何测试getUser(id)方法。对我来说令人困惑的部分是getUserStuff(id)拨打了外部电话,我不想在测试getUser时做出来。

1 个答案:

答案 0 :(得分:5)

正如评论中其他用户所提到的,您需要提供正在进行模拟调用的对象的模拟实例。

因此,在getUser(id)中,我可以看到一个名为service的对象的调用,该对象应该被模拟掉。因此,使用服务类的模拟实例,然后可以模拟对get(id)的调用。

然后在getUserstuff(id)方法中,它使用可以再次模拟的stuffGetter对象。然后被调用的方法可以为它设置期望。 (对此的替代方法也可以是设置部分模拟并一起模拟getUSerstuff(id)方法,但这有点超出您的想法,我认为

考虑到这些因素,我创建了以下类来测试您描述的用例:

public class ClassToTest {

    private final Service service;
    private final StuffGetter stuffGetter;

    public ClassToTest() {
        this( new Service(), new StuffGetter() );
    }

    public ClassToTest(final Service service, final StuffGetter stuffGetter) {
        this.service = service;
        this.stuffGetter = stuffGetter;
    }

    public User getUser(final int id) {
        final User user = this.service.get( id );
        if( user != null ) {
            user.stuff = getUserStuff( id );
            return user;
        }

        throw new NotFoundException();
    }

    public Stuff getUserStuff( final int id ) {
        return this.stuffGetter.getStuff( id );
    }
}

让构造函数设置为这样可以让我能够在测试中设置依赖项的模拟实例。接下来是对getUser(id)方法的测试,该方法对两个对象使用模拟。它使用了期望,重放和验证的基本EasyMock概念。

  • 为模拟方法调用所需的对象创建模拟实例,在本例中为servicestuffGetter
  • 使用expect方法编写对方法调用的期望。如果您正在模拟的方法不是void方法,那么您可以在此处指定将返回的内容。
  • 重播模拟对象,在这种情况下重播它们。这意味着您不能再添加任何期望,因为模拟不再处于记录模式以记录期望。
  • 执行测试。
  • 验证您的模拟上的预期方法调用是否已按要求执行。

测试看起来像这样:

import static org.junit.Assert.assertEquals;

import org.easymock.EasyMock;
import org.junit.Test;

public class ClassToTestTest {

    @Test
    public void thatGetIdCallsExpectedMockMethods() {
        final User user = new User();
        final Stuff userStuff = new Stuff();

        final Service mockService = EasyMock.createMock(Service.class);
        final StuffGetter mockStuffGetter = EasyMock.createMock(StuffGetter.class);

        EasyMock.expect( mockService.get(15) ).andReturn( user );
        EasyMock.expect( mockStuffGetter.getStuff(15) ).andReturn( userStuff );
        EasyMock.replay( mockService, mockStuffGetter );

        final ClassToTest classToTest = new ClassToTest( mockService, mockStuffGetter );
        final User returnedUser = classToTest.getUser(15);
        assertEquals(returnedUser, user);
        assertEquals(returnedUser.stuff, userStuff);

        EasyMock.verify( mockService, mockStuffGetter );
    }
}