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
时做出来。
答案 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概念。
service
和stuffGetter
。 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 );
}
}