spring|微服务项目(Spring Cloud,Dubbo)如何自测?


前言
一个单体项目的自测还是很方便的 。 那如果是一个微服务项目 , 该如何自测呢?
毕竟一个方法中有可能调用好多服务 , 而且调用的服务有可能好没写好 , 如果等别人的项目写好再开始联调的话 , 中途可能会耗费很长时间 , 因为调用的服务和自己的服务都有可能出问题 , 只有在联调的时候才能暴露出来 。
spring|微服务项目(Spring Cloud,Dubbo)如何自测?
本文插图

那有没有更简洁的方法呢?
其实我们可以把我们调用的服务 , 期待返回的结果全mock出来 , 然后跑单测 , 就能保证我们自己这边的服务没有问题 。
mock别人的返回很耗时间 , 不值得把?
并不需要所有的接口都mock , 一些重要业务节点的方法mock一下就行了 。 可能第一次比较耗时间 , 但是后续改动 , 你只需要执行一下单测就行了 , 保证了接口的稳定性 。 所以说微服务的单测还是很有必要的
spring|微服务项目(Spring Cloud,Dubbo)如何自测?
本文插图

测试框架有很多 , Junit , EasyMock , PowerMock , TestNG , DBUnit等 。
建议重要的业务流程写单测 , 使用Junit , EasyMock测试框架假如业务类为A , 单测类的命名方式为ATest , ATest类和A类的包结构保持一致 , 测试的方法名保持一致
IDEA快速生成Test类
所在类按快捷键Win:Ctrl + Shift + TMac:? + command + T
spring|微服务项目(Spring Cloud,Dubbo)如何自测?
本文插图

选中要单测的方法点击OK即可
spring|微服务项目(Spring Cloud,Dubbo)如何自测?
本文插图

EasyMock 看名字就能看出来 , PowerMock更强大 , EasyMock比较简单 。 我平时也是用EasyMock最后 , 就分享一下这个框架的使用
假如有一个ManageService , 依赖另一个服务的UserService
@Servicepublic class ManageService { @Autowired private UserService userServicepublic String getUsername() { return userService.getUsername() }public boolean saveUserInfo(UserInfo userInfo) { return userService.saveUserInfo(userInfo) }}1234567891011121314
public interface UserService { String getUsername() boolean saveUserInfo(UserInfo userInfo)}1234
@Datapublic class UserInfo { private String name private Integer age}12345
可以按照如下方式写单测

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = AppConfig.class)public class ManageServiceTest { @Autowired private ManageService manageService private UserService userService@Test public void getUsername() throws Exception { // 创建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) }}


推荐阅读