一个单体项目的自测还是很方便的。那如果是一个微服务项目,该如何自测呢?
毕竟一个方法中有可能调用好多服务,而且调用的服务有可能好没写好,如果等别人的项目写好再开始联调的话,中途可能会耗费很长时间,因为调用的服务和自己的服务都有可能出问题,只有在联调的时候才能暴露出来。
那有没有更简洁的方法呢?
其实我们可以把我们调用的服务,期待返回的结果全mock出来,然后跑单测,就能保证我们自己这边的服务没有问题。
mock别人的返回很耗时间,不值得把?
并不需要所有的接口都mock,一些重要业务节点的方法mock一下就行了。可能第一次比较耗时间,但是后续改动,你只需要执行一下单测就行了,保证了接口的稳定性。所以说微服务的单测还是很有必要的
测试框架有很多,Junit,EasyMock,PowerMock,TestNG,DBUnit等。
建议重要的业务流程写单测,使用Junit,EasyMock测试框架
假如业务类为A,单测类的命名方式为ATest,ATest类和A类的包结构保持一致,测试的方法名保持一致
所在类按快捷键
Win:Ctrl + Shift + T
Mac:⇧ + command + T
选中要单测的方法点击OK即可
EasyMock看名字就能看出来,PowerMock更强大,EasyMock比较简单。我平时也是用EasyMock最后,就分享一下这个框架的使用
假如有一个ManageService,依赖另一个服务的UserService
@Service
publicclassManageService{
@Autowired
private UserService userService;
public String getUsername(){
return userService.getUsername();
}
publicbooleansaveUserInfo(UserInfo userInfo){
return userService.saveUserInfo(userInfo);
}
}
1234567891011121314
publicinterfaceUserService{
String getUsername();
booleansaveUserInfo(UserInfo userInfo);
}
1234
@Data
publicclassUserInfo{
private String name;
private Integer age;
}
12345
可以按照如下方式写单测
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class ManageServiceTest {
@Autowired
private ManageService manageService;
privateUserServiceuserService;
@Test
publicvoidgetUsername() throwsException {
// 创建mock对象
userService = EasyMock.createMock(UserService.class);
// 调用userService.getUsername()方法时,返回test
EasyMock.expect(userService.getUsername()).andReturn("test");
// 将mock好的userService设置到manageService中
Field userServiceField = manageService.getClass().getDeclaredField("userService");
userServiceField.setAccessible(true);
userServiceField.set(manageService, userService);
EasyMock.replay(userService);
// 开始测试manageService
String username = manageService.getUsername();
System.out.println(username);
assertEquals(username, "test");
}
@Test
public void saveUserInfo() throws Exception {
userService = EasyMock.createMock(UserService.class);
// 传入任意的对象,都会返回true
EasyMock.expect(userService.saveUserInfo(EasyMock.anyObject())).andReturn(true);
Field userServiceField = manageService.getClass().getDeclaredField("userService");
userServiceField.setAccessible(true);
userServiceField.set(manageService, userService);
EasyMock.replay(userService);
boolean flag = manageService.saveUserInfo(EasyMock.anyObject());
System.out.println(flag);
assertTrue(flag);
}
}
上面的例子中我用了一个对象EasyMock.anyObject(),表示不管传入的对象是啥,都会返回true,EasyMock中还有很多类似的方法。
EasyMock.anyBoolean();
EasyMock.anyString();
EasyMock.anyObject();
如果我想针对不同的参数,返回不同的结果,mock2次即可。假如userService有这样一个方法getUsername(String param)。你期待传入1,返回100。传入2,返回200
EasyMock.expect(userService.getUsername(1)).andReturn(100);
EasyMock.expect(userService.getUsername(2)).andReturn(200);
注意,当你传入1,2之外的数字,会报错,因为框架并不知道应该返回啥。
【来源:Java识堂】
声明:转载此文是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系,我们将及时更正、删除,谢谢。 邮箱地址:[email protected]