首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在Scala中使用Mock注解?

如何在Scala中使用Mock注解?
EN

Stack Overflow用户
提问于 2021-11-20 12:32:07
回答 1查看 78关注 0票数 1

我使用scalatest和Scala2.x。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.mockito.Mockito._
import org.mockito._
import org.mockito.ArgumentMatchers._

class Test1 extends AnyFunSuite { 

  val action = Mockito.mock(classOf[Action])
  when(action.process(anyInt())).thenReturn("x")
  ...
}

这不是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.mockito.Mockito._
import org.mockito._
import org.mockito.ArgumentMatchers._

class Test1 extends AnyFunSuite { 

  @Mock
  val action = Action()
  when(action.process(anyInt())).thenReturn("x")
  ...
}

我在"when“行得到了这个异常:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[info] Test1 *** ABORTED ***
[info]   org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Misplaced or misused argument matcher detected here:
[info]
[info] -> at Test1.<init>(Test1.scala:17)
[info]
[info] You cannot use argument matchers outside of verification or stubbing.
[info] Examples of correct usage of argument matchers:
[info]     when(mock.get(anyInt())).thenReturn(null);
[info]     doThrow(new RuntimeException()).when(mock).someVoidMethod(anyObject());
[info]     verify(mock).someMethod(contains("foo"))
[info]
[info] This message may appear after an NullPointerException if the last matcher is returning an object
[info] like any() but the stubbed method signature expect a primitive argument, in this case,
[info] use primitive alternatives.
[info]     when(mock.get(any())); // bad use, will raise NPE
[info]     when(mock.get(anyInt())); // correct usage use
[info]
[info] Also, this error might show up because you use argument matchers with methods that cannot be mocked.
[info] Following methods *cannot* be stubbed/verified: final/private/equals()/hashCode().
[info] Mocking methods declared on non-public parent classes is not supported.
[info]   at Test1.<init>(Test1.scala:17)
[info]   at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
[info]   at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
[info]   at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
[info]   at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
[info]   at java.lang.Class.newInstance(Class.java:442)
[info]   at org.scalatest.tools.Framework$ScalaTestTask.execute(Framework.scala:450)
[info]   at sbt.TestRunner.runTest$1(TestFramework.scala:140)
[info]   at sbt.TestRunner.run(TestFramework.scala:155)
[info]   at sbt.TestFramework$$anon$3$$anonfun$$lessinit$greater$1.$anonfun$apply$1(TestFramework.scala:318)
[info]   ...
EN

回答 1

Stack Overflow用户

发布于 2021-11-22 02:42:13

就我个人而言,我会完全避免嘲笑,但如果你真的需要它,在Scala中,我会使用像ScalaMock这样的东西,它可以更好地与语言合作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Test1 extends AnyFunSuite { 

  val action = mock[Action]
  (action.process _).expects(*).returning("x")
  ...
}

在我看来,@Mock注解依赖于一些custom JUnit runner,它通过将类似于Guice/Spring的依赖注入与模拟相结合,将逻辑注入到测试类中。但是你用错了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Here you would have to configure JUnit runner
// (but Scala test libraries are not really JUnit-based)
class Test1 extends AnyFunSuite { 

  // Here you would have to configure action as var
  // and not initialize it yourself, so that runner could
  // create the mocks and put them here using reflection
  // after instance initialization
  @Mock
  var action: Action = _

  // Here you could not have the test logic be implemented
  // as vals or vars, because it would be executed in object's
  // constructor - when action is still unititialized
  // (therefore null). JUnit doesn't show this issue as it
  // uses @Mock on class attributes, and put @Test logic in
  // methods - called only after constructor is completed
  // and JUnitRunner injects additional logic 
  // ...
}

你完全可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// use JUnit instead of Scalatest
@RunWith(classOf[MockitoJUnitRunner])
class Test1 {

  @Mock
  var action: Action = _

  @Test
  def example(): Unit = {
    // ...
  }
}

因此,它可以在Scala中工作,但不能在非基于JUnit的测试库中工作。如果您对ScalaTest中的Mockito约定感兴趣,请参阅a dedicated documentation page

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70049649

复制
相关文章
FastJson中@JSONField注解使用FastJson中@JSONField注解使用
如果json格式数据不符合Java中的标准驼峰式变量定义规则,并且难以理解,这个时候就需要在后台中做二次处理,将数据处理成我们系统中定义的格式。
一个会写诗的程序员
2018/08/17
1.4K0
30.scala的注解
注解将元信息与定义相关联。例如,方法之前的注解 @deprecated 会导致编译器在该方法被使用时打印警告信息。
Spark学习技巧
2020/06/01
4670
Mockito入门:如何在Spring中Mock部分对象
随着分布式应用的开发逐渐成为标配,多个微服务团队合作来完成垂直业务的开发成为了一种常态。微服务使得团队可以专注于自己的业务逻辑,在和下游依赖和上游对接的团队聚焦好接口之后,就进入正式的开发。但是,每个团队的开发节奏往往不同,下游依赖所提供的服务有些时候不能在自测的时候提供稳定的服务。不仅是多个团队,单个团队中每个人所负责的模块之间也会存在依赖关系,也就同样存在这样的问题。
眯眯眼的猫头鹰
2019/09/30
11.1K0
如何在phpunit中mock一个单例类
Mock简介 当我们对A类进行单元测试时,A类可能依赖了B类,为了减少依赖,方便A类方法的测试,我们可以模拟一个B类,简单规定其各方法的返回值(而非真正实现具体逻辑)。 Phpunit中提供了一套模拟类的api,简单使用如下:
跑马溜溜的球
2020/12/07
1.8K0
Scala中的Map使用例子
Map结构是一种非常常见的结构,在各种程序语言都有对应的api,由于Spark的底层语言是Scala,所以有必要来了解下Scala中的Map使用方法。 (1)不可变Map 特点: api不太丰富 如果是var修饰,引用可变,支持读写 如果是val修饰,引用不可变,只能写入一次值,其后只读 var a:Map[String,Int]=Map("k1"->1,"k2"->2)//初始化构造函数 a += ("k3"->3)//添加元素 a += ("k4"->4)//添加元素 a +=
我是攻城师
2018/05/14
3.2K0
如何在phpunit中mock(模拟)一个单例类
Mock简介 当我们对A类进行单元测试时,A类可能依赖了B类,为了减少依赖,方便A类方法的测试,我们可以模拟一个B类,简单规定其各方法的返回值(而非真正实现具体逻辑)。Phpunit中提供了一套模拟类的api,简单使用如下:
跑马溜溜的球
2020/12/07
3.1K0
【说站】python中mock的断言使用
以上就是python中mock的断言使用,希望对大家有所帮助。更多Python学习指路:python基础教程
很酷的站长
2022/11/23
5340
FastJson中@JSONField注解使用
最近做项目中,使用了json格式在服务器之间进行数据传输。但是发现json格式数据不符合JAVA中的变量定义规则,并且难以理解,因此需要在后台中做二次处理,将数据处理成我们系统中定义的格式。
全栈程序员站长
2022/11/01
1.2K0
SpringBoot中Configure注解和Bean注解的使用
  Configure不加参数,仅声明为配置类,加了参数代表该类为实例,实例名称为参数名
用户2603479
2018/08/15
1.9K0
Scala使用
Scala是一门主要以Java虚拟机(JVM)为目标运行环境并将面向对象和函数式编程语言的最佳特性综合在一起的编程语言。你可以使用Scala编写出更加精简的程序,同时充分利用并发的威力。由于Scala默认运行于JVM之上,因此 它可以访问任何Java类库并且与Java框架进行互操作,比如Scala可以被编译成JavaScript代码,让我们更便捷、高效地开发Web应用。
俺也想起舞
2019/07/24
6140
[249]python mock基本使用
mock在翻译过来有模拟的意思。这里要介绍的mock是辅助单元测试的一个模块。它允许您用模拟对象替换您的系统的部分,并对它们已使用的方式进行断言。
周小董
2022/04/12
4870
【Scala篇】--Scala中的函数
Scala中的函数还是比较重要的,所以本文章把Scala中可能用到的函数列举如下,并做详细说明。
LhWorld哥陪你聊算法
2018/09/13
1.5K0
【Scala篇】--Scala中的函数
使用 Spring 中的 @Lazy 注解
只有一个参数,默认是true,也就是说只要加了这个注解就会延迟加载。 @Lazy注解则必须在第一次调用的时候才会加载。 @Lazy注解注解的作用主要是减少springIOC容器启动的加载时间。
一个会写诗的程序员
2021/03/02
1.9K0
lombok中@EqualsAndHashCode注解的使用
根据姓名查找,会从数据库中返回多条名字相同的数据,那么我们需要使用身份证号去判断名字相同的多个对象是否为同一个人,哪么只需要使用身份证号码判断即可。
关忆北.
2021/12/07
8270
dotnet 如何在 Mock 模拟 Func 判断调用次数
在 dotnet 程序有很好用的 Mock 框架,可以用来模拟各种接口和抽象类,可以用来测试某个注入接口的被调用次数和被调用时传入参数。本文告诉大家如何在 Mock 里面模拟一个 Func 同时模拟返回对象,获取调用次数
林德熙
2019/06/15
1.3K0
Jest中Mock网络请求
最近需要将一个比较老的库修改为TS并进行单元测试,修改为TS还能会一点,单元测试纯粹是现学现卖了,初学Jest框架,觉得在单元测试中比较麻烦的就是测试网络请求,所以记录一下Mock掉Axios发起网络请求的一些方式。初学两天的小白,如有问题还请指出。
冬夜先生
2021/09/13
2.6K0
如何在Scala中读取Hadoop集群上的gz压缩文件
存在Hadoop集群上的文件,大部分都会经过压缩,如果是压缩后的文件,我们直接在应用程序中如何读取里面的数据?答案是肯定的,但是比普通的文本读取要稍微复杂一点,需要使用到Hadoop的压缩工具类支持,比如处理gz,snappy,lzo,bz压缩的,前提是首先我们的Hadoop集群得支持上面提到的各种压缩文件。 本次就给出一个读取gz压缩文件的例子核心代码: 压缩和解压模块用的工具包是apache-commons下面的类: import org.apache.commons.io.IOUtils impor
我是攻城师
2018/05/14
2.7K0
dotnet 如何在 Mock 模拟 Func 判断调用次数
在 dotnet 程序有很好用的 Mock 框架,可以用来模拟各种接口和抽象类,可以用来测试某个注入接口的被调用次数和被调用时传入参数。本文告诉大家如何在 Mock 里面模拟一个 Func 同时模拟返回对象,获取调用次数
林德熙
2022/08/07
8410
Springboot中使用Scala开发使用SB與Scala
https://github.com/LightSwordSpringBoot/lightsword
一个会写诗的程序员
2018/08/20
1.1K0
点击加载更多

相似问题

Scala注解继承

23

Scala中的复杂注解

11

如何在scala中使用包含@JoinColumn的注解@JoinTable

10

scala中的Singleton模式,支持轻松使用mock

23

Scala中的嵌套注解列表

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文