资讯专栏INFORMATION COLUMN

单元测试

Atom / 386人阅读

摘要:在对逻辑进行重构的时候可以直接通过单元测试能把控整个重构的逻辑不发生重大偏差,给后来者造福了。服务单元测试下面是一段获取缓存逻辑的单元测试。

单元测试在开发的过程中可能会被很多的人所忽略,其实也不是真的被忽略可能是由于巨大的业务压力而导致没有时间去写那些测试,而是直接通过集成测试完没问题就提交给测试进行测试后上线了。这样其实很多时候反而会浪费大量的时间在测试上面,而适量的写好单元测试有以下一些优势:

有单元测试可能会提高整个集成测试的进度而且最重要的是做到对自己写的代码知根知底,更有底气的推到线上去。

在对逻辑进行重构的时候可以直接通过单元测试能把控整个重构的逻辑不发生重大偏差,给后来者造福了。

服务单元测试

下面是一段获取缓存逻辑的单元测试。CacheManager中封装了逻辑从缓冲中取数据,如果数据没有取到则从repositoryCache.loadStoreByKey(key)中load数据。

public void getValueIfNullLoadTest() {
    /* 从repository里面取数据 */
    RepositoryCache repositoryCache = mock(RepositoryCache.class);
    String key = anyString();
    when(repositoryCache.loadStoreByKey(key)).thenReturn("test");
    when(repositoryCache.getCacheName()).thenReturn(Constants.CACHE);

    CacheManager.addRepository(repositoryCache);
    String value = CacheManager.getValueIfNullLoad(Constants.CACHE, key, String.class);

    Assert.assertTrue(StringUtils.equals(value, "test"));

    /* 从缓存中取 */
    value = CacheManager.getValueByCache(Constants.CACHE, key, String.class);
    Assert.assertTrue(StringUtils.equals(value, "test"));

}

mockrepositoryCache,当调用repositoryCacheloadStoreByKey或者getCacheName方法后返回测试数据。

后面执行CacheManager.getValueIfNullLoad中正常的业务逻辑。

最后判断结果是否符合预期。

controller单元测试

上面一小节只是针对普通的服务单元进行测试,但是遇到http的接口测试就无能为力了,下面来介绍下如果写http接口的单元测试。

public class UserControllerUnitTest {

    private MockMvc mockMvc;

    @Mock
    private UserService userService;

    @InjectMocks
    private UserController userController;

    @Before
    public void init(){
        MockitoAnnotations.initMocks(this);
        mockMvc = MockMvcBuilders
                .standaloneSetup(userController)
                .addFilters(new CORSFilter())
                .build();
    }

    @Test
    public void test_get_all_success() throws Exception {
        List users = Arrays.asList(
                new User(1, "Daenerys Targaryen"),
                new User(2, "John Snow"));
        when(userService.getAll()).thenReturn(users);
        mockMvc.perform(MockMvcRequestBuilders.get("/users"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE))
                .andExpect(mvcResult -> {
                    String responseStr = mvcResult.getResponse().getContentAsString();
                    //针对结果进行验证。
                });
        Mockito.verify(userService, times(1)).getAll();
        Mockito.verifyNoMoreInteractions(userService);
    }

}

mock一个服务userService

InjectMocks userController后通过MockitoAnnotations.initMocks(this)userService这个mock的服务注入到userController中。

MockMvcBuilders.standaloneSetup(userController).build(); 创建MockMvc

后面就是模拟发送http请求,然后验证response的操作和上一节的类似。

最后是验证mock服务的接口调用次数。

总结

可能你也会在项目中看到很多的单元测试,但是随着项目的迭代那些单元测试已经失效,又或者是你会看到在进行单元测试的时候会去启动整个项目容器去做运行,不过只要有就是好的,后面在进行项目迭代的过程中别忘了把unit test写上吧。

参考

Unit Test Spring MVC Rest Service: MockMVC, JUnit, Mockito

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70489.html

相关文章

  • 随行付微服务测试单元测试

    摘要:输出结果需要人工检查的测试不是一个好的单元测试。为了有效的进行单元测试,需要遵循一定的方法,通常采用路径覆盖法设计单元测试用例。 在微服务架构下高覆盖率的单元测试是保障代码质量的第一道也是最重要的关口,应该持之以恒。 背景 单元测试为代码质量保驾护航,是提高业务质量的最直接手段,实践证明,非常多的缺陷完全可以通过单元测试来发现,测试金字塔提出者Martin Fowler 强调如果一个高...

    xiguadada 评论0 收藏0
  • 谈谈为什么写单元测试

    摘要:原文作者键盘男单元测试是什么单元测试是针对程序的最小单元来进行正确性检验的测试工作。因此,首要任务,就是对单元测试全面了解。作为一名经验丰富的程序员,写单元测试更多的是对自己的代码负责。 原文:http://www.jianshu.com/p/bc99678b1d6e作者:键盘男kkmike999 showImg(/img/bVCqyN); 单元测试是什么 单元测试 是针对 程序的最小...

    ermaoL 评论0 收藏0
  • 2021年软件测试工具总结——单元测试工具

    摘要:单元测试框架作为的标准库,是其他单元测试框架的基础。可以和和配合使用编写单元测试。官网地址单元测试覆盖率工具单元测试中还需要用到代码覆盖率工具。代码覆盖率统计工具用来发现没有被测试覆盖的代码,完善单元测试的覆盖率。 在应用程序中,单元是具有一个或多个输入和单个输出的软件中最小可测试部分。单元...

    qingshanli1988 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<