我找不到任何解释如何模拟在scalamock中不带参数的重载方法的文档,例如
public boolean isInfoEnabled(Marker marker);
public boolean isInfoEnabled();
Run Code Online (Sandbox Code Playgroud)
要模拟带标记的功能,可以简单地使用
(loggerMock.isInfoEnabled(_: Marker)).expects(*).returning(true)
Run Code Online (Sandbox Code Playgroud)
但是如何模拟不带参数的其他方法呢?任何帮助表示赞赏.
我想将一个带有依赖项的scala类的方法存根.有没有办法使用ScalaMock实现这一目标?
这是我所拥有的简化示例:
class TeamService(val dep1: D1) {
def method1(param: Int) = param * dep1.magicNumber()
def method2(param: Int) = {
method1(param) * 2
}
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我想嘲笑method1()
.我的测试看起来像:
val teamService = ??? // creates a stub
(teamService.method1 _).when(33).returns(22)
teamService.method2(33).should be(44)
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这个目标?
使用ScalaMock,我想模拟/存根一个类方法,因此它将为每次调用返回一个不同的值(调用顺序很重要).
我可以用mock
和实现这一点expects
,但这将迫使我验证这些调用.
我可以这样做stub
吗?
另外,我怎么能说"第一次返回X,然后总是返回Y"(两者都带有mock
和stub
)?
我想知道ExecutionContext
我应该使用哪些(以及为什么)scalatest % 2.2.6
来运行我的未来和模拟的未来.
class Foo {
def foo: Future[String] = Future.sucessful("B")
}
class Bar(foo: Foo) {
def bar: Future[String] = foo.foo()
}
class MyTest extends WordSpec {
implicit val ec: ExecutionContext = ??? // ...global? Why global? Why not?
val myMock = mock[Foo]
val myBar = new Bar(myMock)
"..." in {
(myMock.foo _).expects(*).returning(Future.succesful("A"))
whenReady(myBar.bar())(_ shouldBe "A")
}
}
Run Code Online (Sandbox Code Playgroud) 在scalamock的文档中,据说:
模拟类,特征和案例类
是支持的功能之一.
我有以下案例类:
case class Thing(private val item: Item)
Run Code Online (Sandbox Code Playgroud)
当我做:
val item = mock[Thing]
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Run Code Online (Sandbox Code Playgroud)Error:(18, 24) not enough arguments for constructor Thing: (item: org.dspace.content.Item)org.iadb.poolpartyconnector.dspaceutils.Thing. Unspecified value parameter item. val item = mock[Thing] ^
我知道我可以为它实现一个接口,但无论如何,这将有助于我更好地理解如何模拟case类/具有构造函数的类.
非常感谢,
Maatari
我有一些看起来像这样的代码:
package org.samidarko.actors
import org.samidarko.helpers.Lib
class Monitoring extends Actor {
override def receive: Receive = {
case Tick =>
Lib.sendNotification()
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法像使用nodejs的 proxyquire一样从ScalaTest模拟/存根 ?Lib
我读到我可以使用依赖注入,但我宁愿不这样做
我唯一的选择是将我的 lib 作为类参数传递吗?
class Monitoring(lib: Lib) extends Actor {
Run Code Online (Sandbox Code Playgroud)
有什么建议可以使它更易于测试吗?谢谢
编辑:
Xavier Guihot的答案是一个有趣的问题方法,但我选择更改代码以进行测试。
我正在传递Lib
as 参数并使用mockito 进行模拟,它使代码更易于测试和维护,而不是隐藏作用域。
我正在将 Scalamock 与 ScalaTest 一起使用,并尝试模拟 Java 接口。我目前有:
private val _iface = mock [MyInterface]
Run Code Online (Sandbox Code Playgroud)
现在我想做
_iface expects `someMethod returning "foo" once
Run Code Online (Sandbox Code Playgroud)
但是编译器没有找到expects
.
我进口org.scalatest._
和org.scalamock.scalatest._
。我还缺少什么?
我需要使用 java 接口中的可变参数来模拟一个方法
public interface MyClient {
MyResponse indexPrivileges(IndexPrivilege... parameters);
}
Run Code Online (Sandbox Code Playgroud)
我在嘲笑它
(mockMyClient.indexPrivileges _).expects(*).returns(response)
Run Code Online (Sandbox Code Playgroud)
但得到一个错误
[error] /projects/lib-scala-projects/src/test/scala/com/example/MyManagerTest.scala:67: value expects is not a member of com.example.parameters.IndexPrivilege* => com.example.MyResponse
[error] (mockMyClient.indexPrivileges _).expects(*).returns(response)
[error] ^
Run Code Online (Sandbox Code Playgroud)
另外,我尝试传递 IndexPrivilege 的 Seq 无济于事
(mockMyClient.indexPrivileges _).expects(privileges).returns(response)
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我的 Spark 应用程序中有一个方法可以从 MySQL 数据库加载数据。该方法看起来像这样。
trait DataManager {
val session: SparkSession
def loadFromDatabase(input: Input): DataFrame = {
session.read.jdbc(input.jdbcUrl, s"(${input.selectQuery}) T0",
input.columnName, 0L, input.maxId, input.parallelism, input.connectionProperties)
}
}
Run Code Online (Sandbox Code Playgroud)
该方法除了执行jdbc
方法并从数据库加载数据之外不执行任何其他操作。我该如何测试这个方法?标准方法是创建对象的模拟,session
该对象是 的实例SparkSession
。但由于SparkSession
有一个私有构造函数,我无法使用 ScalaMock 来模拟它。
这里的主要问题是我的函数是一个纯粹的副作用函数(副作用是从关系数据库中提取数据),并且鉴于我在模拟时遇到问题,我如何对该函数进行单元测试SparkSession
。
那么有什么方法可以模拟SparkSession
或者比模拟更好的方法来测试这个方法呢?
Scala 新手,已广泛搜索以澄清某些 ScalaMock 语法。根据本指南,我不断看到以下一般测试模式:
(myClass.myMethod _).expects()
这里到底发生了什么?类/方法/空格/下划线有什么功能?编译器如何处理这个问题?
scalamock ×10
scala ×8
unit-testing ×6
scalatest ×5
mocking ×4
apache-spark ×1
future ×1
testing ×1