具有值类参数的 Mockito 存根方法因 NullPointerException 而失败

编程入门 行业动态 更新时间:2024-10-21 11:33:55
本文介绍了具有值类参数的 Mockito 存根方法因 NullPointerException 而失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

使用类型化值类作为 ID 是 Scala 中的一种常见模式.但是,在对将值类作为参数的方法进行存根时,Mockito 似乎存在问题.在下面的示例中,带有实际值的第一个存根工作正常,但使用参数匹配器的第二个存根抛出 NullPointerException.

我发现的唯一参考是这个问题 但那里显示的解决方案不起作用.任何人都知道解决方案或解决方法?

版本为:org.mockito:mockito-all:1.10.19 和 org.specs2:specs2_2.11:2.4.15

import org.specs2.mutable.Specification导入 org.specs2.matcher.Matchers导入 org.specs2.mock.Mockitocase 类 ID[T](val id:Long) 扩展 AnyVal特质 DAO[T]{def get(id:ID[T]):T}类 MockitoIDStubTest 使用带有匹配器的 Mockito 扩展规范{Mockito"应该{{中的带有参数值的正确存根"val m = 模拟[DAO[字符串]m.get(ID[String](1)).returns("abc")m.get(ID[String](1)) must_== "abc"}使用参数匹配器正确存根"{val m = 模拟[DAO[字符串]m.get(any[ID[String]]).returns("abc")m.get(ID[String](1)) must_== "abc"}}}

[信息] Mockito 应该

[info] + 带有参数值的正确存根

[信息]!使用参数匹配器正确存根

[错误] NullPointerException:(MockitoIDStubTest.scala:20)

[错误] MockitoIDStubTest$$anonfun$1$$anonfun$apply$5$$anonfun$apply$6.apply(MockitoIDStubTest.scala:20)

解决方案

它似乎适用于 scalamock 和 scalatest.我仍然想为 Mockito 找到一个解决方案,所以我不必更改几百个测试.

import org.scalatest._导入 org.scalamock.scalatest.MockFactorycase 类 ID[T](val id:Long) 扩展 AnyVal特质 DAO[T]{def get(id:ID[T]):T}ScalaMockIDStubTest 类使用 MockFactory{ 扩展 WordSpec导入 language.postfixOpsScalaMock"应该{{中的带有参数值的正确存根"val m = 存根 [DAO [字符串](m.get _) 当(ID[String](1)) 返回("abc")断言( m.get(ID[String](1)) == "abc")}使用参数匹配器正确存根"{val m = 存根 [DAO [字符串](m.get _) when(*) 返回("abc")断言( m.get(ID[String](1)) == "abc")}}}

Using typed value classes as IDs is a common pattern in Scala. However, it seems Mockito has an issue when stubbing methods that take value classes as arguments. In the example below, the first stub, with an actual value works just fine, but the second one, that uses an argument matcher throws NullPointerException.

The only reference to this I've found is this question but the solution shown there does not work. Anyone knows a solution to this, or a work-around?

Versions are: org.mockito:mockito-all:1.10.19 and org.specs2:specs2_2.11:2.4.15

import org.specs2.mutable.Specification import org.specs2.matcher.Matchers import org.specs2.mock.Mockito case class ID[T](val id:Long) extends AnyVal trait DAO[T]{ def get(id:ID[T]):T } class MockitoIDStubTest extends Specification with Mockito with Matchers{ "Mockito" should{ "properly stub with argument value" in { val m = mock[DAO[String] m.get(ID[String](1)).returns("abc") m.get(ID[String](1)) must_== "abc" } "properly stub with argument matcher" in { val m = mock[DAO[String] m.get(any[ID[String]]).returns("abc") m.get(ID[String](1)) must_== "abc" } } }

[info] Mockito should

[info] + properly stub with argument value

[info] ! properly stub with argument matcher

[error] NullPointerException:(MockitoIDStubTest.scala:20)

[error] MockitoIDStubTest$$anonfun$1$$anonfun$apply$5$$anonfun$apply$6.apply( MockitoIDStubTest.scala:20)

解决方案

It seems to work with scalamock and scalatest. I would still like to find a solution for Mockito tho, so I don't have to change a few hundred tests.

import org.scalatest._ import org.scalamock.scalatest.MockFactory case class ID[T](val id:Long) extends AnyVal trait DAO[T]{ def get(id:ID[T]):T } class ScalaMockIDStubTest extends WordSpec with MockFactory{ import language.postfixOps "ScalaMock" should{ "properly stub with argument value" in { val m = stub[DAO[String] (m.get _) when(ID[String](1)) returns("abc") assert( m.get(ID[String](1)) == "abc") } "properly stub with argument matcher" in { val m = stub[DAO[String] (m.get _) when(*) returns("abc") assert( m.get(ID[String](1)) == "abc") } } }

更多推荐

具有值类参数的 Mockito 存根方法因 NullPointerException 而失败

本文发布于:2023-10-31 04:47:20,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1545049.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:存根   参数   方法   NullPointerException   Mockito

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!