目录介绍 01.LiveData是什么东西 02.使用LiveData的优势 03.使用LiveData的步骤 04.简单使用LiveData 05.observe()和observerForever(...当然我们也可以使用 LiveData 的 observerForever() 方法进行订阅,区别是 observerForever() 不会受到 Activity 等组件的生命周期的影响,只要数据更新就会收到通知...每个新的订阅者,其version都是-1,LiveData一旦设置过其version是大于-1的(每次LiveData设置值都会使其version加1),这样就会导致LiveDataBus每注册一个新的订阅者...在我们的观察者状态变更(inactive->active)的时候, 也会通知到, 这就导致了LiveData必然支持粘性事件。...在联动生命周期时,会自动在 DESTROYED 的状态下移除 Observer ,取消订阅,所以不用担心内存泄露; LiveData的观察者只能与一个LifecycleOwner绑定, 否则会抛出异常。
为什么使用JUnit5 JUnit4被广泛使用,但是许多场景下使用起来语法较为繁琐,JUnit5中支持lambda表达式,语法简单且代码不冗余。...其实单测是开发人员必备技能,只不过很多开发人员开发任务太重导致调试完就不管了,没有系统化得单元测试,单元测试在系统重构时能发挥巨大的作用,可以在重构后快速测试新的接口是否与重构前有出入。...@BeforeAll:在每个单元测试方法执行前执行一遍(只执行一次) @DisplayName("商品入库测试"):用于指定单元测试的名称 @Disabled:当前单元测试置为无效,即单元测试时跳过该测试...,并可以使用异常类型接收返回值进行其他操作 @Test @DisplayName("测试断言抛异常") void testThrows() { ArithmeticException arithExcep...@SpringBootTest @AutoConfigureMockMvc @DisplayName("Junit5单元测试") public class MockTest { //....
为什么使用JUnit5 JUnit4被广泛使用,但是许多场景下使用起来语法较为繁琐,JUnit5中支持lambda表达式,语法简单且代码不冗余。...其实单测是开发人员必备技能,只不过很多开发人员开发任务太重导致调试完就不管了,没有系统化得单元测试,单元测试在系统重构时能发挥巨大的作用,可以在重构后快速测试新的接口是否与重构前有出入。 简介 ?...@BeforeAll:在每个单元测试方法执行前执行一遍(只执行一次) @DisplayName("商品入库测试"):用于指定单元测试的名称 @Disabled:当前单元测试置为无效,...,并可以使用异常类型接收返回值进行其他操作 @Test @DisplayName("测试断言抛异常") void testThrows() { ArithmeticException...@SpringBootTest @AutoConfigureMockMvc @DisplayName("Junit5单元测试") public class MockTest { //....
为什么使用JUnit5 JUnit4被广泛使用,但是许多场景下使用起来语法较为繁琐,JUnit5中支持lambda表达式,语法简单且代码不冗余。...其实单测是开发人员必备技能,只不过很多开发人员开发任务太重导致调试完就不管了,没有系统化得单元测试,单元测试在系统重构时能发挥巨大的作用,可以在重构后快速测试新的接口是否与重构前有出入。 简介 ?...@BeforeAll:在每个单元测试方法执行前执行一遍(只执行一次) @DisplayName("商品入库测试"):用于指定单元测试的名称 @Disabled:当前单元测试置为无效,即单元测试时跳过该测试...,并可以使用异常类型接收返回值进行其他操作 @Test @DisplayName("测试断言抛异常") void testThrows() { ArithmeticException...@SpringBootTest @AutoConfigureMockMvc @DisplayName("Junit5单元测试") public class MockTest { //....
,JUnit5中支持lambda表达式,语法简单且代码不冗余。...其实单测是开发人员必备技能,只不过很多开发人员开发任务太重导致调试完就不管了,没有系统化得单元测试,单元测试在系统重构时能发挥巨大的作用,可以在重构后快速测试新的接口是否与重构前有出入。...@BeforeAll:在每个单元测试方法执行前执行一遍(只执行一次) @DisplayName("商品入库测试"):用于指定单元测试的名称 @Disabled:当前单元测试置为无效,即单元测试时跳过该测试...,并可以使用异常类型接收返回值进行其他操作 @Test @DisplayName("测试断言抛异常") void testThrows() { ArithmeticException arithExcep...@SpringBootTest @AutoConfigureMockMvc @DisplayName("Junit5单元测试") public class MockTest { //....
JUnit5 的变化 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库 作为最新版本的JUnit框架,JUnit5与之前版本的Junit框架有很大的不同。...* @AfterEach :表示在每个单元测试之后执行 * @BeforeAll :表示在所有单元测试之前执行 * @AfterAll :表示在所有单元测试之后执行 * @Tag :表示单元测试类别...异常断言 在JUnit4时期,想要测试方法的异常情况时,需要用@Rule注解的ExpectedException变量还是比较麻烦的。...") @Test void testException() { //断定业务逻辑一定出现异常 assertThrows(ArithmeticException.class...参数化测试 参数化测试是JUnit5很重要的一个新特性,它使得用不同的参数多次运行测试成为了可能,也为我们的单元测试带来许多便利。
,JUnit5中支持lambda表达式,语法简单且代码不冗余。...其实单测是开发人员必备技能,只不过很多开发人员开发任务太重导致调试完就不管了,没有系统化得单元测试,单元测试在系统重构时能发挥巨大的作用,可以在重构后快速测试新的接口是否与重构前有出入。...@BeforeAll:在每个单元测试方法执行前执行一遍(只执行一次) @DisplayName("商品入库测试"):用于指定单元测试的名称 @Disabled:当前单元测试置为无效,即单元测试时跳过该测试...,并可以使用异常类型接收返回值进行其他操作 @Test @DisplayName("测试断言抛异常") void testThrows() { ArithmeticException arithExcep...Copy@SpringBootTest @AutoConfigureMockMvc @DisplayName("Junit5单元测试") public class MockTest { //..
单元测试 JUnit5 的变化 JUnit5常用注解 常用注解使用演示 断言机制(assertions) 1、简单断言 2、数组断言 3、组合断言 4、异常断言 5、超时断言 6、快速失败 4、前置条件...(assumptions) 5、嵌套测试 6、参数化测试 Junit4到Junit5的迁移指南 ---- JUnit5 的变化 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库...@AfterEach :表示在每个单元测试之后执行 @BeforeAll :表示在所有单元测试之前执行 @AfterAll :表示在所有单元测试之后执行 标注这上面两个注解的方法必须是static @...而JUnit5提供了一种新的断言方式Assertions.assertThrows() ,配合函数式编程就可以进行使用 第一个参数是预期出现的异常类型,第二个参数是Executable 接口,第三个参数是不符合第一个异常时抛出的信息...断定业务逻辑一定会出现异常,否则会抛出异常 @Test @DisplayName("异常测试") public void exceptionTest() { ArithmeticException
junit5 JUnit5在2017年就发布了,你还在用junit4吗? 什么是junit5 与以前的JUnit版本不同,JUnit 5由三个不同子项目的多个不同模块组成。...@AfterEach: 表示在每个单元测试之后执行 @BeforeAll: 表示在所有单元测试之前执行 @AfterAll: 表示在所有单元测试之后执行 @Tag: 表示单元测试类别,类似于JUnit4...: Junit4时需要使用rule方式,junit5提供了assertThrows更优雅的异常断言 @Test void exceptionTesting() { Throwable exception...image-20210416232702304 @CsvFileSource使用classpath中的CSV文件,CSV文件中的每一行都会导致参数化测试的一次调用 这种就完全把测试数据与测试方法隔离,达到更好解耦效果...3); // 断言包含字符串 不包含字符串 assertThat("niu").contains("iu").doesNotContain("love"); // 断言字符串只出现过一次
单元测试中不允许使用 System.out 来进行人工验证,而必须使用断言来验证。 为了保证单元测试稳定可靠且便于维护,需要保证其独立性。用例之间不允许互相调用,也不允许出现执行次序的先后依赖。...在执行 testMethod2 时会重复执行验证testMethod1,导致运行效率降低。更严重的是,testMethod1的验证失败会影响 testMethod2 的执行。...如果单测对外部环境(网络、服务、中间件等)有依赖 ,则容易导致持续集成机制的不可用。 编写单元测试时要保证测试粒度足够小,这样有助于精确定位问题,单元测试 用例默认是方法级别的。...为了发现代代码中潜在的错误 我们需要在编写测试用例时有一些强制的错误输入(如非法数据、异常流程、非业务允许输入等)来得到预期的错误结果。...断言数组元素全部相等 assertSame/assertNotSame 断言指定两个对象是否为同一个对象 assertThrows/assertDoesNotThrows 断言是否抛出了一个特定类型的异常
JUnit5 单元测试示例 在上节中已经提到 JUnit5 与 JUnit4 有所不同,本节还是用同样的示例来看一下 JUnit5 的使用。...因此,需要根据具体使用的版本来确定是否需要@ExtendWith(SpringExtension.class)注解,否则可能会出现注解无效的情况虽然单元测试类的代码与 JUnit4 基本相同,但本质上还是有区别的...时,如果你只是把类上的注解换了,会发现通过@Resource 或@Autowired 注入的 OrderService 会抛出空指针异常。...在 JUnit4中默认使用的@Test 注解为 org.junit.Test,而在 JUnit5 中需要使用 org.junit.jupiter.api.Test.因此,如果在升级的过程中出现莫名其妙的空指针异常时...,JUnit5 也提供了一套自己的注解。
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于《JUnit5学习》系列 《JUnit5学习》...),Assertions类的一系列静态方法给我们提供了单元测试时常用的断言功能,本篇主要内容如下: Assertions源码分析 写一段代码,使用Assertions的常用静态方法 使用异常断言 使用超时断言...()->String.format("期望值[%d],实际值[%d]", expected, actual)); } assertAll方法可以将多个判断逻辑放在一起处理,只要有一个报错就会导致整体测试不通过...Assertions.assertThrows方法,用来测试Executable实例执行execute方法时是否抛出指定类型的异常; 如果execute方法执行时不抛出异常,或者抛出的异常与期望类型不一致...,都会导致测试失败; 写段代码验证一下,如下,1除以0会抛出ArithmeticException异常,符合assertThrows指定的异常类型,因此测试可以通过: @Test @DisplayName
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于《JUnit5学习》系列 《JUnit5学习》...Tests)基础 参数化测试(Parameterized Tests)进阶 综合进阶(终篇) 本篇概览 本文是《JUnit5学习》系列的第二篇,学习一个重要的知识点:Assumptions类,只有了解了它们...log.info("assumpFail的assumeTrue执行完成"); // 接下来是常规的单元测试逻辑,但因为前面抛出了异常,就不再执行了 assertEquals...(2, Math.addExact(1,1)); } } 点击下图红框位置执行单元测试: 执行结果如下: 另外,在target目录,可以看到surefire插件生成的单元测试报告TEST-com.bolingcavalry.assertassume.service.impl.AssertAssumpTest.xml...,如下图所示,testcase节点中出现了skipped节点: 上述对比验证再次说明Assertions和Assumptions的区别:都用来对比预期值和实际值,当预期值和实际值不一致时,Assertions
写单元测试太耗费时间了,项目要赶进度,编写单元测试会导致不能按时完成开发任务,导致项目延期; 做传统xx管理系统的项目,业务逻辑比较简单,主要就是对业务数据做增删改查,单元测试意义和价值不高; 公司有专门的测试人员...不要过于相信覆盖率数据,100%的测试覆盖率并不能保证bug的不出现。...异常测试 它用于测试由方法抛出的异常。...,因为这是一个预期的异常,因此单元测试会通过。...参考资料 单元测试大揭密 JUnit教程 JUnit5用户指南中文版 Mockito中文文档 单元测试准则
背景 软件系统刚开发完成时几乎不会出现Bug。为什么呢?...因为刚开发第一版软件系统时,需求并不复杂,场景也不是很多,因此实现起来比较简单,再加上测试小哥哥/小姐姐保驾护航,基本不会出现比较严重的bug。...当数据库写入失败时抛出:SYSTEM_EXCEPTION异常 以上的几种行为便是单元测试所需要验证的内容,然而这些行为的验证都离不开DB的支持,因此我们需要通过Mock跳过DB操作,于是编写了如下的单元测试...每一个开发人员都需要能够在本地反复的执行单元测试,所以单元测试不建议依赖任何的外部因素,这些因素都可能导致单元测试的失败,包括mysql、nacos、seate、redis、openFeign、三方接口等...Junit4、Junit5:单元测试运行框架 Mockito、Wiremock:mock框架,用来模拟一些对象行为 SonarQube:代码静态扫描平台,可以通过静态扫描检查代码漏洞、代码规范、代码重复率
这两哥们可谓是形影不离,网上的很多文章,几乎也都会同时提到它们,但是...当协程的Flow稳定之后,这两个好兄弟就突然出现了隔阂,当然,其实隔阂绝不是一天就有的,这也许是压死LiveData的最后一根稻草...LiveData的主要问题: postValue在异步线程可能丢失数据:源码中新建Runnable的时候,只对mPendingData进行了修改,并不是加入线程池,导致数据丢失 对数据流的处理能力偏弱:...只提供了map、switchMap等有限的处理能力 粘性事件问题:LiveData在注册时,会触发LifecycleOwner的activeStateChanged,触发了onChange,导致在注册前的事件也被发送出来...RxJava轻量,而且将数据和UI分离,便于单元测试,不像MVP那样臃肿的同时,也更难体现分层架构的独立职责。...,协程,异常捕获,生命周期控制有机的融合到了一起,作为一个OneShot的UI界面,我们在极简代码的基础上,实现了良好的分层架构。
异常类型错误 其中有条异常被吃了,会导致事务无法回滚,这个引起我的好奇,是否真的是这样,刚好也没写文素材了,就来聊聊事务与异常在某些场景产生的化学反应 示例素材 1、一张没啥业务含义的表,就单纯用来演示用...service接口 public interface TxTestService { void saveTxTestA(); void saveTxTestB(); } 3、一份非必需品的单元测试...txTestService.saveTxTestA(); } @Test void testTxB() { txTestService.saveTxTestB(); } } 注: 用的是junit5...运行单元测试方法 @Test void testTxA() { txTestService.saveTxTestA(); } 得到如下结果 [在这里插入图片描述] 答案: 是可以插入 原因: if...saveTxTestB会回滚,纯粹是因为saveTxTestD抛出的异常,传递到了saveTxTestB,导致saveTxTestB也因为RuntimeException发生了回滚了 问题延伸: 如果想
单元测试是软件开发中必不可少的一环,但是在平常开发中往往因为项目周期紧,工作量大而被选择忽略,这样往往导致软件问题层出不穷。...线上出现的不少问题其实在有单元测试的情况下就可以及时发现和处理,因此培养自己在日常开发中写单元测试的能力是很有必要的。...无论是对自己的编码能力的提高,还是项目质量的提升,都是大有好处,本文将介绍 Java 单元测试框架 JUnit 5 的基础认识,和使用来编写单元测试。...编写用例——基本的单元测试类和方法: 在了解了常用JUnit5 及其注解之后,我们来写一些基本的测试用例: import org.junit.jupiter.api.*; import org.slf4j.Logger...String first,int second){ assertNotNull(first); assertNotEquals(0, second); } JUnit 5 测试套件: 通过JUnit5
异常类型错误 其中有条异常被吃了,会导致事务无法回滚,这个引起我的好奇,是否真的是这样,刚好也没写文素材了,就来聊聊事务与异常在某些场景产生的化学反应 02 示例素材 01 一张没啥业务含义的表,就单纯用来演示用...service接口 public interface TxTestService { void saveTxTestA(); void saveTxTestB(); } 03 一份非必需品的单元测试...txTestService.saveTxTestA(); } @Test void testTxB() { txTestService.saveTxTestB(); } } 注: 用的是junit5...saveTxTestB会回滚,纯粹是因为saveTxTestD抛出的异常,传递到了saveTxTestB,导致saveTxTestB也因为RuntimeException发生了回滚了 问题延伸: 如果想...再次运行单元测试,得到如下结果 04 总结 我们在平时可能会为了面试背了一些八股文,但实际场景可能会远比这些八股文复杂多,因此我们在看这些八股文时,可以多加思考,可能会得到一些我们平时忽略的东西
1、数据倒灌的出现 场景: 如果我们在一个home页面获取网络数据,然后通过LiveData的观察者特性,在回调中跳转B页面,当旋转屏幕时,页面重建,LiveData又发来最后一次数据,那么直接触发了跳转...倒灌原因小结 Activity异常销毁然后重建,ViewModel会保存销毁之前的数据,然后在Activity重建完成后进行数据恢复,所以LiveData成员变量中的mVersion会恢复到重建之前的值...由于LiveData本身的特性,Activity的生命周期由非活跃变成活跃时,LiveData会触发事件分发,导致屏幕旋转或者切换系统语言后出现数据倒灌。...注意 但是这里有一点要非常注意:系统内存不足,杀到应用后台,也会导致Activity重建,但是不会LiveData导致数据倒灌。 问题找到了,那如何防止数据倒灌呢?...如果当前Activity回到前台LiveData不需要接收最新的数据,可以使用下面三中扩展的LiveData 官方扩展的SingleLiveEvent 美团反射修改mVersion UnPeek-LiveData
领取专属 10元无门槛券
手把手带您无忧上云