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

模拟存储库函数会导致空指针异常,尽管使用了when和thenReturn

存储库函数的模拟是在软件测试中常见的一种技术手段,用于模拟数据库或其他外部依赖的行为。通过模拟存储库函数,我们可以在测试过程中隔离代码的依赖关系,并确保测试的可重复性和可控性。

然而,当使用when和thenReturn来模拟存储库函数时,有时候可能会出现空指针异常的情况。这通常是因为我们在使用when和thenReturn时没有正确设置模拟对象的行为或参数匹配条件。

为了解决这个问题,我们需要确保以下几点:

  1. 确保正确创建模拟对象:使用框架提供的模拟工具(如Mockito)创建存储库函数的模拟对象,并通过依赖注入或其他方式将其注入到被测试的代码中。
  2. 设置模拟对象的行为:使用when和thenReturn来设置模拟对象的行为,确保返回预期的结果。在设置行为时,需要考虑参数匹配条件,以确保模拟对象在接收到正确参数时返回正确的结果。
  3. 验证参数匹配条件:在设置模拟对象的行为时,需要确保参数匹配条件是正确的。如果参数匹配条件不正确,模拟对象可能无法匹配到对应的行为,导致默认的行为返回null,进而引发空指针异常。
  4. 处理可能的空指针异常:即使我们已经尽力设置了正确的模拟对象行为和参数匹配条件,有时候仍然可能会出现空指针异常。在代码编写过程中,我们需要注意对模拟对象的空值判断,以及在必要时处理可能的异常情况,以确保代码的健壮性和可靠性。

总结起来,模拟存储库函数时,尽管使用了when和thenReturn,但仍需要注意正确创建模拟对象、设置模拟对象的行为和参数匹配条件,并处理可能的空指针异常。这样可以确保模拟存储库函数的有效性和测试的可靠性。

腾讯云相关产品:腾讯云数据库、腾讯云服务器、腾讯云云原生应用平台、腾讯云网络安全、腾讯云音视频处理、腾讯云人工智能、腾讯云物联网、腾讯云移动开发、腾讯云对象存储、腾讯云区块链等。

腾讯云产品介绍链接地址:

  1. 腾讯云数据库:https://cloud.tencent.com/product/cdb
  2. 腾讯云服务器:https://cloud.tencent.com/product/cvm
  3. 腾讯云云原生应用平台:https://cloud.tencent.com/product/tke
  4. 腾讯云网络安全:https://cloud.tencent.com/product/ddos
  5. 腾讯云音视频处理:https://cloud.tencent.com/product/mps
  6. 腾讯云人工智能:https://cloud.tencent.com/product/ai
  7. 腾讯云物联网:https://cloud.tencent.com/product/iotexplorer
  8. 腾讯云移动开发:https://cloud.tencent.com/product/baas
  9. 腾讯云对象存储:https://cloud.tencent.com/product/cos
  10. 腾讯云区块链:https://cloud.tencent.com/product/baas
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

MeterSphere单元测试-Mockito-Inline出场

如果大于则表明存在重名,程序抛出异常。 测试用例-第一版 因此,我们设计一个测试用例,来模拟测试计划重名的场景。...Given- 新建测试计划 When- 根据给定测试计划名称查询数据库返回不为 Then-抛出异常 根据这个场景,我们来编写一下测试用例 package io.metersphere.track.service...testPlanService.addTestPlan(addTestPlanRequest)).hasMessage("plan_name_already_exists"); } } 执行一下,发现居然指针异常了...SessionUtils.getCurrentWorkspaceId()运行的结果是Null,而andWorkspaceIdEqualTo(String workSpaceId)方法中如果入参为null,则会抛出指针异常...(() -> { SessionUtils.getCurrentWorkspaceId();}).thenReturn("NeedWorkSpaceIdHere"); translator.when

3.3K10

#Android单元测试学习总结「建议收藏」

,如果不为抛出异常携带指定的message信息 assertNotNull(Object object) 断言对象不为 assertNotNull(Object object) 断言对象不为,如果为抛出异常携带指定的...还有一个主要的问题就是本地单元测试由于是运行本地JVM环境,无法依赖Android的api,只靠纯Junit的测试环境很难模拟出完整的Android环境,导致无法测试Android相关的代码,而Mock.../ clear抛出异常 mockedList.clear(); } doXXXthenXXX使用上差不多,一个是调用方法之前设置好返回值,一个是在调用方法之后设置返回值。...Boolean anyByte() 匹配任何byteByte anyCollection() 匹配任何非Collection anyDouble() 匹配任何doubleDouble anyFloat...() 匹配任何floatFloat anyInt() 匹配任何intInteger anyList() 匹配任何非List anyLong() 匹配任何longLong anyMap

5K20
  • 静态类参数无法传递问题

    然后就发现神奇的事情,他居然返回为。完全同步到它里面的内存值,一开始我还想着不是缓存异常,是不是需要去看一下它的一些字节码指令之类的。我特地打了一个断点。还加了一些条件判断,指定某一个特殊的。...我把一个静态类给所以导致他接下来所有的方法全部都会mock。这就导致一系列的异常,什么控制啊什么判断异常啊,到处的问题。好了,现在的问题不再是读取。一些声明的属性值的问题了,而是变成了我怎么去。...), any(), any())) .thenReturn(FileTypeEnum.FOLDER); // 对其他方法进行正常访问 when(...进模拟的数据又让我跑全了整体的单元测试。...从这个单元测试上面来看,我完全可以自己写,使一些值来进行一个测试,但是后面我发现当我解决了这个问题之后,我跑一下单元测试,又发现我程序之后之中的一些bug,一些异常没有处理到。

    17400

    MockitoPowerMock用法

    在单元测试中,我们往往想去独立地去测一个类中的某个方法,但是这个类可不是独立的,它会去调用一些其它类的方法service,这也就导致了以下两个问题:外部服务可能无法在单元测试的环境中正常工作,因为它们可能需要访问数据库或者使用一些其它的外部系统...我们的测试关注点在于这个类的实现上,外部类的一些行为可能影响到我们对本类的测试,那也就失去了我们进行单测的意义。..."xiaoming", "xiaohong"); when(person.getName()).thenReturn("xiaoming"); when(person.getName()).thenReturn...(); // 4、mockito还能对被测试的方法强行抛出异常 Person person =mock(Person.class); doThrow(new RuntimeException()).when...null); verify(userAppMapper, only()).getAppSecretByAppKey(anyString()); } // 注意:verify记录着这个模拟对象调用了什么方法

    3.1K32

    Mockito模拟进行单元测试

    1.3 StubMock异同 相同:StubMock都是模拟外部依赖 不同:Stub是完全模拟一个外部依赖, 而Mock还可以用来判断测试通过还是失败  1.4 Mockito资源 官网: http...(mock).add(1); verify(mock).clear(); } 模拟我们所期望的结果 @Test public void when_thenReturn(){ //mock...doThrow(new IOException()).when(outputStream).close(); outputStream.close(); } 模拟方法体抛出异常 @Test...NULL,但是使用了Answer改变了默认期望值 assertEquals(999, mock.get(1)); //下面的size()没有预设,通常情况下返回0,但是使用了Answer...List list = new LinkedList(); List spy = spy(list); //下面预设的spy.get(0)会报错,因为会调用真实对象的get(0),所以抛出越界异常

    9.4K20

    Mockito模拟进行单元测试

    如下图所示: 为了测试类A,我们需要Mock B类C类(用虚拟对象来代替)如下图所示: 1.3 StubMock异同 相同:StubMock都是模拟外部依赖 不同:Stub是完全模拟一个外部依赖...(mock).add(1); verify(mock).clear(); } 模拟我们所期望的结果 @Test public void when_thenReturn(){ //mock...doThrow(new IOException()).when(outputStream).close(); outputStream.close(); } 模拟方法体抛出异常 @Test...NULL,但是使用了Answer改变了默认期望值 assertEquals(999, mock.get(1)); //下面的size()没有预设,通常情况下返回0,但是使用了Answer...List list = new LinkedList(); List spy = spy(list); //下面预设的spy.get(0)会报错,因为会调用真实对象的get(0),所以抛出越界异常

    6.9K20

    Android开发之逻辑单元测试

    (ManagerFactory.getInstance()).thenReturn(managerFactory); doReturnthenReturn的区别 SyncInformHandler syncInformHandler...).when(ManagerFactory.getInstance()); 以上的代码就显示出doReturnthenReturn的区别了,thenReturn之前的when里的参数是可以调用响应方法的.../ 以下抛出IndexOutOfBoundsException异常 // PowerMockito.when(spy.get(0)).thenReturn("sss"); PowerMockito.doReturn...,罗列出原先设计方案所支持的那些场景,然后用单元测试模拟这些场景来测试,例如我想测试一些多线程场景的问题,所以在测试方法里开启多个线程,而且在这些线程运行结束之前这个测试方法不能结束,所以要wait,...这样有可能导致这个测试方法运行很久,对于一个大工程来说,测试类可能有几十个,测试方法可能有上百个,那么导致这个工程跑单元测试的时候跑很久才结束,可能大大降低jinkens的编译速度,因为理论上一个单元测试方法的执行时间都是

    1.4K10

    SpringBoot - 单元测试利器Mockito入门

    举个例子: 类 A 需要调用类 B 类 C,而类 B 类 C 又需要调用其他类如 D、E、F 等,假设类 D 是一个外部服务,那就会很难测,因为你的返回结果直接的受外部服务影响,导致你的单元测试可能今天会过...---- What’s Mockito Mockito 是一种 Java Mock 框架,主要就是用来做 Mock 测试的,它可以模拟任何 Spring 管理的 Bean、模拟方法的返回值、模拟抛出异常等等...,同时也记录调用这些模拟方法的参数、调用顺序,从而可以校验出这个 Mock 对象是否有被正确的顺序调用,以及按照期望的参数被调用。...Mockito.when( 对象.方法名() ).thenReturn( 自定义结果 ) 代码如下: @RunWith(SpringRunner.class) @SpringBootTest publicclass...Mockito.when(userService.getUserById(Mockito.anyInt())).thenReturn(new User(3, "Aritisan")); User user1

    16.2K42

    用过举手!SpringBoot 单元测试利器-Mockito

    Mockito 是一种 Java mock 框架,他主要是用来做 mock 测试的,他可以模拟任何 Spring 管理的 bean、模拟方法的返回值、模拟抛出异常...等,在了解 Mockito 的具体用法之前...D、E、F 等,假设类 D 是一个外部服务,那就会很难测,因为你的返回结果直接的受外部服务影响,导致你的单元测试可能今天会过、但明天就过不了了 ?...管理的 bean、模拟方法的返回值、模拟抛出异常...等,他同时也记录调用这些模拟方法的参数、调用顺序,从而可以校验出这个 mock 对象是否有被正确的顺序调用,以及按照期望的参数被调用 像是 Mockito...mock 对象的方法时,就回传我们想要的自定义结果 Mockito.when( 对象.方法名() ).thenReturn( 自定义结果 ) 使用 Mockito 模拟 bean 的单元测试具体实例如下...方法时,就回传一个名字为 I'm mock3 的 user 对象 Mockito.when(userService.getUserById(Mockito.anyInt())).thenReturn(

    2.6K10

    深入理解单元测试:技巧与最佳实践

    其实当我们了解了他的原理就能知道具体的原因:当我们 debug 运行时会发现 udpCollect 对象是有值的,而如果我们去掉这个注解 @InjectMocks 再运行就会抛空指针异常。...模拟行为只是注入进去还不够,我们还需要模拟它的行为:比如调用某个函数可以模拟返回数据模拟函数调用抛出异常模拟函数调用耗时这里以最常见的模拟函数返回为例:String clusterNodes = connection.sync...(cmd.clusterInfo()).thenReturn(clusterInfo); 此时我们就可以使用 Mockito.when().thenReturn() 来模拟这个函数的返回数据...()).thenReturn(cmd); Mockito.when(cmd.info(metrics.getName())).thenReturn(info); Mockito.when...还是以 Pulsar 为例,它的集成测试是需要模拟在本地启动一个服务端(因为 Pulsar 的服务端源码测试代码都是 Java 写的,更方便做测试),然后再运行测试代码。

    7500

    使用强大的 Mockito 来测试你的代码

    stub 类是依赖类的部分方法实现,而这些方法在你测试类接口的时候会被用到,也就是说 stub 类在测试中会被实例化。stub 类回应任何外部测试的调用。...譬如说,验证只有某个存在 Mock 对象的方法是否被调用了。 2.4 使用mockito生成mock对象 Mockito 是一个流行 mock 框架,可以JUnit结合起来使用。...when(….).thenReturn(….)可以被用来定义当条件满足时函数的返回值,如果你需要定义多个返回值,可以多次定义。...(spy).get(0); // 下面代码不生效 // 真正的方法会被调用 // 将会抛出 IndexOutOfBoundsException 的异常,因为 List 为 when(spy.get(0...)).thenReturn("foo"); 方法verifyNoMoreInteractions()允许你检查没有其他的方法被调用了

    11.1K60

    工作多年后我更了解了UT的重要性

    ,所以返回都是null 2、模拟对象方法调用的返回值 List cache = mock(ArrayList.class); when(cache.get(0)).thenReturn("hello"...4、模拟对象方法调用抛出异常 List cache = mock(ArrayList.class); when(cache.get(0)).thenReturn(new Exception("Exception...(cache.get(2)); //-> 0,0 7、模拟方法是否被调用调用的次数,预期调用了一次 List cache = mock(ArrayList.class); cache.add("steven...这样我们的单元测试在运行中就会去连接网络中的服务器导致测试失败。在业务类中类似这种涉及到单例类的调用经常用到。 这种情况下我们需要修改下业务代码使代码可测。 第一种方法:提取方法并在测试类中复写。...同时需要注意的是不建议在静态类中维护状态信息,特别是在并发环境中,若无适当的同步措施而修改多线程并发时,导致坏的竞态条件。

    1.5K50
    领券