微服务(Dubbo,Spring Cloud)如何单测?

前言

测试框架有很多,Junit,EasyMock,PowerMock,TestNG,DBUnit等。

建议重要的业务流程写单测,使用Junit,EasyMock测试框架

假如业务类为A,单测类的命名方式为ATest,ATest类和A类的包结构保持一致,测试的方法名保持一致

IDEA快速生成Test类

所在类按快捷键
Win:Ctrl + Shift + T
Mac:⇧ + command + T
在这里插入图片描述
选中要单测的方法点击OK即可
在这里插入图片描述

Junit

不要简单的打印结果,最后写上期望的断言,如

assertTrue(flag);
assertEquals(username, "test");

EasyMock

在微服务应用中,有时候需要调用别人的服务,在别人接口没开发好的情况下,如何进行单测呢?这时候就得Mock别人服务的返回值

假如有一个ManageService,依赖另一个服务的UserService

@Service
public class ManageService {
    
    

    @Autowired
    private UserService userService;

    public String getUsername() {
    
    
        return userService.getUsername();
    }
    
    public boolean saveUserInfo(UserInfo userInfo) {
    
    
        return userService.saveUserInfo(userInfo);
    }
}
public interface UserService {
    
    

    String getUsername();

    boolean saveUserInfo(UserInfo userInfo);
}
@Data
public class UserInfo {
    
    

    private String name;
    private Integer age;
}

可以按照如下方式写单测

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class ManageServiceTest {
    
    

    @Autowired
    private ManageService manageService;

    private UserService userService;

    @Test
    public void getUsername() throws Exception {
    
    

        userService = EasyMock.createMock(UserService.class);
        EasyMock.expect(userService.getUsername()).andReturn("test");
        Field userServiceField = manageService.getClass().getDeclaredField("userService");
        userServiceField.setAccessible(true);
        userServiceField.set(manageService, userService);
        EasyMock.replay(userService);
        String username = manageService.getUsername();
        System.out.println(username);
        assertEquals(username, "test");
    }

    @Test
    public void saveUserInfo() throws Exception {
    
    

        userService = EasyMock.createMock(UserService.class);
        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.anyBoolean();
 EasyMock.anyString();
 EasyMock.anyObject();

参考博客

[1]http://thoreauz.com/2017/07/20/devops/test/JAVA常用测试框架/
[2]https://blog.csdn.net/a672489861/article/details/10065133
测试web
[3]https://juejin.im/post/5b694ff7e51d4519475f7fbc
测试json
[4]https://www.baeldung.com/jsonassert
Junit断言
[5]http://wiki.jikexueyuan.com/project/junit/using-assertion.html
[6]https://www.cnblogs.com/shugen/p/6863027.html
maven生成测试报告+哪些类会被测试
[7]https://blog.csdn.net/fireofjava/article/details/28630449
好文
[8]https://www.cnblogs.com/mistor/p/5225380.html

猜你喜欢

转载自blog.csdn.net/zzti_erlie/article/details/106720391