首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Mockito会抛出NPE (带弹簧靴的junit5)?

Mockito会抛出NPE (带弹簧靴的junit5)的原因是在使用Mockito进行单元测试时,当调用被模拟对象的方法时,如果该方法返回值为null,而测试代码中对该返回值进行了操作,就会抛出NullPointerException(NPE)异常。

Mockito是一个Java框架,用于创建和管理模拟对象,以便进行单元测试。它通过模拟依赖对象的行为,使得测试代码可以独立于实际依赖对象的状态和行为进行测试。

在使用Mockito时,我们可以使用when-then模式来定义模拟对象的行为。当调用模拟对象的方法时,可以使用when方法指定方法的参数和返回值,然后使用thenReturn方法指定返回值。但是,如果我们没有正确地设置模拟对象的返回值,或者对返回值进行了错误的操作,就有可能导致NPE异常的抛出。

例如,假设我们有一个名为userService的模拟对象,并且我们在测试代码中调用了它的getUser方法。如果我们没有正确地设置getUser方法的返回值,或者对返回值进行了错误的操作,就有可能导致NPE异常的抛出。

解决这个问题的方法是,在使用Mockito进行单元测试时,确保正确设置模拟对象的返回值,并且对返回值进行合理的操作。可以使用Mockito的when-then模式来定义模拟对象的行为,并且在测试代码中对返回值进行null检查,以避免NPE异常的发生。

总结起来,Mockito会抛出NPE异常的原因是在使用Mockito进行单元测试时,对模拟对象的返回值进行了错误的操作或者没有正确设置返回值。为了避免这个问题,需要正确设置模拟对象的返回值,并在测试代码中对返回值进行null检查。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

让你快速上手,从JUnit 4过渡到JUnit 5

该代码段将帮助您了解为什么2.0.3使用JUnit 4。 图像右侧是spring-boot-test最新版本。...Runwith注释是JUnit 4特定注释,该注释提供了测试运行引擎。 MockedBean注释类中注释依赖项类(如Adder和Subtractor)。...尽管Spring Boot父pom已添加了Mockito新版本,但Mockito API并未发生变化,支持开箱即用Mockito,支持Junit5,尝试将测试类作为JUnit测试运行。...Mockito API没有任何变化,尽管Spring Boot父pom已添加了新版本Mockito,因此无需进行任何操作即可立即支持带有MockitoJunit5,尝试将测试类作为JUnit测试运行...这样,您就可以使用Mockito将第一组测试成功迁移到Junit5。 结论 在本练习中,您学习了如何从JUnit 4项目迁移到新JUnit 5版本。

2.5K10

@Spy、@SpyBean、@MockBean、@Mock、@RunWith、@ExtendWith对比

前言 在写单元测试中经常会用到Mockito,但是这些类似的注解非常混乱,今天总结一下相关注解,说明其中含义和实现例子。...Mockito.mock() vs @Mock vs @MockBean Mockito.mock ()方法允许我们创建类或接口模拟对象。...在@SpyBean测试情况下,我们必须使用@Autowired注释来注入依赖组件。否则,在运行时,Spring Boot 创建一个新实例。...@SpyBean需要手动注入bean,但是@Spy 不需要,除非你调用了依赖 总结 @Spy、@SpyBean、@MockBean、@Mock、@RunWith、@ExtendWith,bean就跟集成测试有关...,例如集成Spring,如果只是简单单元测试可以配置不带Bean,这里面最好区分还是@RunWith和@ExtendWith,一个是JUnit4一个是JUnit5

91910

@Spy、@SpyBean、@MockBean、@Mock、@RunWith、@ExtendWith对比

前言在写单元测试中经常会用到Mockito,但是这些类似的注解非常混乱,今天总结一下相关注解,说明其中含义和实现例子。...需要注意是,我们应该只在测试类中使用它。与mock()方法不同是,我们需要启用Mockito注解才能使用该注解。...在@SpyBean测试情况下,我们必须使用@Autowired注释来注入依赖组件。否则,在运行时,Spring Boot 创建一个新实例。...@SpyBean需要手动注入bean,但是@Spy 不需要,除非你调用了依赖总结@Spy、@SpyBean、@MockBean、@Mock、@RunWith、@ExtendWith,bean就跟集成测试有关...,例如集成Spring,如果只是简单单元测试可以配置不带Bean,这里面最好区分还是@RunWith和@ExtendWith,一个是JUnit4一个是JUnit5

89091

如何正确编写单元测试?

为什么呢?因为刚开发第一版软件系统时,需求并不复杂,场景也不是很多,因此实现起来比较简单,再加上测试小哥哥/小姐姐保驾护航,基本不会出现比较严重bug。...即使最后想要重构,也感觉无从下手,因为你无法预估代码变更所带来风险。 测试金字塔 针对上述问题,业界有一套公认指导方案——测试金字塔。...据我了解JUnit有两个广泛流传版本,分别是JUnit4与Junit5,这两个版本用法存在着很多差异,因此不建议混合使用,SpringBoot框架中已经默认支持了JUnit作为测试框架。...异常 当数据库写入失败时抛出:SYSTEM_EXCEPTION异常 以上几种行为便是单元测试所需要验证内容,然而这些行为验证都离不开DB支持,因此我们需要通过Mock跳过DB操作,于是编写了如下单元测试...Junit4、Junit5:单元测试运行框架 Mockito、Wiremock:mock框架,用来模拟一些对象行为 SonarQube:代码静态扫描平台,可以通过静态扫描检查代码漏洞、代码规范、代码重复率

2.6K40

Head First Android Testing 1

Context.MODE_PRIVATE)); oos.writeObject(data); oos.close(); } catch (Exception e) {//NPE...(5)运行测试有两种方式,可以简单地和运行普通程序一样点击Run按钮,结果显示在下面的Run视图窗口中,也可以在终端运行....前者只运行当前测试运行参数中配置测试类和方法,而后者检测整个项目中所有Unit Test并进行测试。 上面四个测试中只有前三个是通过,最后一个没能通过。...testOptions { unitTests.returnDefaultValues = true } } [文件android.jar中并不包含实际代码,所有方法都只是空盒子,默认情况下都会抛出异常...,这就使得你Unit Test不会依赖于Android系统某些特定行为,但是也带来其他问题(如果你没有使用显式地Mock的话),如果遇到这类问题可以尝试在builde.gradle文件中加上上面的配置修改原有的抛出异常行为

62120

Junit5系列-Junit5中assertThrows()与assertDoesNotThrow()方法详解

简介 Junit5中新添加了对方法抛出异常断言Assertions类中assertThrows()和assertDoesNotThrow(),使用此方法可以对被测试方法抛出异常进行断言测试,而在...//1:执行此语句抛出一个ArithmeticException异常,被assertThrows方法捕获 AssertTestModel.testThrowArithmeticException...assertDoesNotThrow方法,在没有异常抛出情况下返回一个值 int re = assertDoesNotThrow(() -> { int result...和Assertions关系和我们在Junit5系列-Junit5中Assertions断言类一文中Assertions和assertTrue关系一样。...,通过自定义打印信息messageOrSupplier组装异常并抛出(AssertionFailedError为Junit5自定义异常) String message = AssertionUtils.buildPrefix

11.7K70

JUnit5学习之二:Assumptions类

欢迎访问我GitHub 这里分类和汇总了欣宸全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于《JUnit5学习》系列 《JUnit5学习》...Tests)基础 参数化测试(Parameterized Tests)进阶 综合进阶(终篇) 本篇概览 本文是《JUnit5学习》系列第二篇,学习一个重要知识点:Assumptions类,只有了解了它们...即假设类,里面提供了很多静态方法,例如assumeTrue,如果assumeTrue入参为false,就会抛出TestAbortedException异常,Junit对抛出此异常方法判定为跳过; 简单说...,Assertions方法抛出异常意味着测试不通过,Assumptions方法抛出异常意味着测试被跳过(为什么称为"跳过"?...@DisplayName("assume失败时自定义错误信息") void tryAssumeTrueWithMessage() { // 第二个入参是Supplier

39730

SpringBoot对单元测试支持、常用单元测试功能使用实例

国内大多数开发人员对单元测试有所忽视,这也是我写本章内容原因所在。 本章围绕 Spring Boot 对单元测试支持、常用单元测试功能使用实例以及 MockMvc自动配置机制展开。...AssertJ:支持流式断言 Java 测试框架。 .Hamcrest: 一个匹配器库。 Mockito :一个 Java Mock 框架。 JSONassert:一个针对 JSON 断言库。...JUnit5 单元测试示例 在上节中已经提到 JUnit5 与 JUnit4 有所不同,本节还是用同样示例来看一下 JUnit5 使用。...,就是从 JUnit4 升级到 JUnit5 时,如果你只是把类上注解换了,会发现通过@Resource 或@Autowired 注入 OrderService 抛出空指针异常。...这是为什么呢? 原因很简单,从 JUnit4 升级到 JUnit5 时,在 testInsert 方法 上@Test 注解变了。

1.6K30

Spring 介绍

Spring官网 为什么是Spring? Spring 使每个人 Java 编程更快、更容易、更安全。Spring 对速度、简单性和生产力关注使其成为世界上最受欢迎Java框架。...到处都是Spring Spring 灵活库受到全世界开发人员信任。Spring 每天为数百万最终用户提供令人愉悦体验——无论是流媒体电视,网上购物,或无数其他创新解决方案。...无论您是为 Web 构建安全、响应式、基于云微服务,还是为企业构建复杂流数据流,Spring 都有可以提供帮助工具。...Spring多产 弹簧改变您处理 Java 编程任务方式,从根本上简化您体验。Spring Boot 结合了应用程序上下文和自动配置嵌入式 Web 服务器等必需品,使微服务发展不在话下。...Spring快 我们工程师非常关心性能。使用 Spring,您注意到默认情况下快速启动、快速关闭和优化执行。越来越多Spring项目也支持被动(非阻塞)编程模型以获得更高效率。

12030

Java 中常见单元测试(一):JUnit 篇

我们为什么写不好单元测试 写不好单元测试情况有很多,很多时候我们也是被需求压着身不由己就开始 “ 胡编乱写” 了。...当然不只是单元测试,其实开发连注释都不写 。 单元测试重要性 1. 代码质量 单元测试提高了代码质量。在实际编码之前编写测试让你去更多思考方法或者对象边界,使您编写更好代码。 2....单元测试图片 自动生成代码如下(如果你熟悉了就可以自己手写,但是 IDEA 能生成,我就不手写了),被标记 @Test 方法可以单独测试执行,如果你在 IDEA 上可以看到侧边栏有绿色箭头小圆圈...在业务项目中,往往情况更加复杂,需要一些其他辅助工具来完成单元测试。下篇文档介绍一下其他功能使用。...常见工具 JUnit Mockito Assertj Hamrest Moco 结合 Spring ut Mock 对象 DB 参考资料 https://junit.org/junit5/docs/

6.8K40

懵逼...

之前逛知乎,看到这个问题时候我一下都懵逼了。 为什么 return null 时候,程序不会抛出 NPE 呢? 好像有千言万语,又不知从何说起。...唯一因为null值而引起NullPointerException动作是“解引用”(dereference)——也就是通过这个引用要对其引用对象做操作。...当然,用户可以在自己需要地方显式检查null值然后自己抛出NPE,就像: java.util.Objects.requireNonNull(Object) /** * Checks...说真的,我也认为在程序里面引入 return null 不太好,加入这样一行代码后势必会带来一个非空判断,是不太优雅。 还不如抛出一个异常。...而关于这个问题,在《阿里巴巴JAVA开发手册》里面是这样描述: 总之,求同存异,目的都是为了防止 NPE 出现。 防止 NPE 是程序员基本修养。

30320

JUnit5学习之三:Assertions类

欢迎访问我GitHub 这里分类和汇总了欣宸全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于《JUnit5学习》系列 《JUnit5学习》...Tests)基础 参数化测试(Parameterized Tests)进阶 综合进阶(终篇) 本篇概览 本文是《JUnit5学习》系列第三篇,主要是学习Assertions类(org.junit.jupiter.api.Assertions...Supplier.get方法获取字符串作为失败提示消息(如果测试通过则Supplier.get方法不会被执行): @Test @DisplayName("失败提示判断(拼接消息字符串代码只有判断失败时才执行...; 如果execute方法执行时不抛出异常,或者抛出异常与期望类型不一致,都会导致测试失败; 写段代码验证一下,如下,1除以0抛出ArithmeticException异常,符合assertThrows...; springboot默认依赖了hamcrest库,依赖关系如下图: 一个简单基于hamcrest匹配器单元测试代码如下,由于预期和实际值不相等,因此匹配失败: package

60930

Java开发中如何正确踩坑

为什么说一个好员工能顶 100 个普通员工 我们做法是,要用最好的人。我一直都认为研发本身是很有创造性,如果人不放松,或不够聪明,都很难做得好。...4.Map 下 NPE Map 应该是我们开发中使用最频繁了,最常用可能有 HashMap、ConcurrentHashMap 这俩了,可能一不留神写出这样代码: ?...由于 HashMap 干扰,很多人认为 ConcurrentHashMap 是可以置入 null 值,而事实上, 存储 null 值时会抛出 NPE 异常 Map 类集合 K/V 能不能存储 null...还需要注意一点,在你转换后,再对数组值进行修改时,集合也跟着变哦(注释掉代码)。...在 subList 场景中,高度注意对原集合元素个数修改,导致子列表遍历、增加、删除均产生异常。

60040

Mockito模拟进行单元测试

验证数据逻辑处理性,而其中mock较好框架就是Mockito。...1.2 为什么需要Mock 测试驱动开发( TDD)要求我们先写单元测试,再写实现代码。...在写单元测试过程中,我们往往遇到要测试类有很多依赖,这些依赖类/对象/资源又有别的依赖,从而形成一个大依赖树,要在单元测试环境中完整地构建这样依赖,是一件很困难事情。...(0)会报错,因为会调用真实对象get(0),所以抛出越界异常 //when(spy.get(0)).thenReturn(3); //使用doReturn-when可以避免when-thenReturn...,因为add(2)没有被验证,所以下面的代码失败抛出异常 verifyNoMoreInteractions(list2); } Mockito并不是创建一个真实对象,而是模拟这个对象,他用简单

6.9K20

Mockito模拟进行单元测试

验证数据逻辑处理性,而其中mock较好框架就是Mockito。     ...1.2 为什么需要Mock 测试驱动开发( TDD)要求我们先写单元测试,再写实现代码。...在写单元测试过程中,我们往往遇到要测试类有很多依赖,这些依赖类/对象/资源又有别的依赖,从而形成一个大依赖树,要在单元测试环境中完整地构建这样依赖,是一件很困难事情。...(0)会报错,因为会调用真实对象get(0),所以抛出越界异常 //when(spy.get(0)).thenReturn(3); //使用doReturn-when可以避免when-thenReturn...,因为add(2)没有被验证,所以下面的代码失败抛出异常 verifyNoMoreInteractions(list2); } Mockito并不是创建一个真实对象,而是模拟这个对象,他用简单

9.3K20
领券