资讯专栏INFORMATION COLUMN

单元测试

Atom / 272人阅读

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

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

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

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

服务单元测试

下面是一段获取缓存逻辑的单元测试。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
  • 谈谈为什么写单元测试

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

    elliott_hu 评论0 收藏0
  • Android单元测试(二):再来谈谈为什么

    摘要:再次,率的降低和的减少,也难以证明就是单元测试的作用。在这种情况下,单元测试是才是最好的工具。这也是单元测试节约时间的地方。写单元测试需要时间,这也是不能否认的事情,至于有单 今天早上8点半坐到桌子前,打开电脑,看了几分钟体育新闻,做其他一些准备工作,到9点开始真正开始着手写这篇文章。于是开始google,找资料,打算列一大段冠冕堂皇的理由,来说明为什么要写单元测试,比如: 对软件质...

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

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

    qingshanli1988 评论0 收藏0
  • 【腾讯Bugly干货分享】安卓单元测试:What, Why and How

    摘要:本期,我们邀请了蘑菇街开发工程师小创,为大家分享安卓单元测试。今天很高兴跟大家分享一下,我在安卓单元测试方面的一些经验。单元测试也是类似的道理。单元测试可以减少,尽早发现,从而减少了和的时间。我们应该最关注的是单元测试。 本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d28... Dev Club 是一个交流移...

    waruqi 评论0 收藏0

发表评论

0条评论

Atom

|高级讲师

TA的文章

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