如何使用 Mockito 模拟 Scala 对象中的函数?
How to mock a function within Scala object using Mockito?
我是 Scala 的新手。我尝试使用 Mockito 模拟一个简单的 Scala 函数,但出现以下错误。我已经上网查了,但没能找出错误。
object TempScalaService {
def login(userName: String, password: String): Boolean = {
if (userName.equals("root") && password.equals("admin123")) {
return true
}
else return false
}
}
我的测试class如下
class TempScalaServiceTest extends FunSuite with MockitoSugar{
test ("test login "){
val service = mock[TempScalaService.type]
when(service.login("user", "testuser")).thenReturn(true)
//some implementation
}
}
但是我收到以下错误:
Cannot mock/spy class com.pearson.tellurium.analytics.aggregation.TempScalaService$
Mockito cannot mock/spy following:
- final classes
- anonymous classes
- primitive types
org.mockito.exceptions.base.MockitoException:
Cannot mock/spy class com.pearson.tellurium.analytics.aggregation.TempScalaService$
Mockito cannot mock/spy following:
- final classes
- anonymous classes
- primitive types
at org.scalatest.mock.MockitoSugar$class.mock(MockitoSugar.scala:74)
at com.pearson.tellurium.analytics.aggregation.TempScalaServiceTest.mock(Temp ScalaServiceTest.scala:7)
at com.pearson.tellurium.analytics.aggregation.TempScalaServiceTest$$anonfun$ 1.apply$mcV$sp(TempScalaServiceTest.scala:10)
at com.pearson.tellurium.analytics.aggregation.TempScalaServiceTest$$anonfun$ 1.apply(TempScalaServiceTest.scala:9)
at com.pearson.tellurium.analytics.aggregation.TempScalaServiceTest$$anonfun$ 1.apply(TempScalaServiceTest.scala:9)
at org.scalatest.Transformer$$anonfun$apply.apply$mcV$sp(Transformer.scala: 22)
at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
您不能模拟对象,请尝试将您的代码移动到 class:
class TempScalaService() {
def login(userName: String, password: String): Boolean = {
if (userName.equals("root") && password.equals("admin123")) {
return true
}
else return false
}
}
并创建服务:
object TempScalaService {
private val service = TempScalaService()
def apply() = service
}
如果使用依赖项注入框架会更好,但现在可以使用。
现在,为了测试,使用:
val service = mock[TempScalaService]
when(service.login("user", "testuser")).thenReturn(true)
您可以在对象扩展的特征中定义方法。然后简单地模拟特征:
trait Login {
def login(userName: String, password: String): Boolean
}
object TempScalaService extends Login {
def login(userName: String, password: String): Boolean = {
if (userName.equals("root") && password.equals("admin123")) {
return true
}
else return false
}
}
//in your test
val service = mock[Login]
您可以创建一个 Scala 伴随对象:
- 为您编写测试用例class。
- 让那个对象做外部世界的交互。
我是 Scala 的新手。我尝试使用 Mockito 模拟一个简单的 Scala 函数,但出现以下错误。我已经上网查了,但没能找出错误。
object TempScalaService {
def login(userName: String, password: String): Boolean = {
if (userName.equals("root") && password.equals("admin123")) {
return true
}
else return false
}
}
我的测试class如下
class TempScalaServiceTest extends FunSuite with MockitoSugar{
test ("test login "){
val service = mock[TempScalaService.type]
when(service.login("user", "testuser")).thenReturn(true)
//some implementation
}
}
但是我收到以下错误:
Cannot mock/spy class com.pearson.tellurium.analytics.aggregation.TempScalaService$
Mockito cannot mock/spy following:
- final classes
- anonymous classes
- primitive types
org.mockito.exceptions.base.MockitoException:
Cannot mock/spy class com.pearson.tellurium.analytics.aggregation.TempScalaService$
Mockito cannot mock/spy following:
- final classes
- anonymous classes
- primitive types
at org.scalatest.mock.MockitoSugar$class.mock(MockitoSugar.scala:74)
at com.pearson.tellurium.analytics.aggregation.TempScalaServiceTest.mock(Temp ScalaServiceTest.scala:7)
at com.pearson.tellurium.analytics.aggregation.TempScalaServiceTest$$anonfun$ 1.apply$mcV$sp(TempScalaServiceTest.scala:10)
at com.pearson.tellurium.analytics.aggregation.TempScalaServiceTest$$anonfun$ 1.apply(TempScalaServiceTest.scala:9)
at com.pearson.tellurium.analytics.aggregation.TempScalaServiceTest$$anonfun$ 1.apply(TempScalaServiceTest.scala:9)
at org.scalatest.Transformer$$anonfun$apply.apply$mcV$sp(Transformer.scala: 22)
at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
您不能模拟对象,请尝试将您的代码移动到 class:
class TempScalaService() {
def login(userName: String, password: String): Boolean = {
if (userName.equals("root") && password.equals("admin123")) {
return true
}
else return false
}
}
并创建服务:
object TempScalaService {
private val service = TempScalaService()
def apply() = service
}
如果使用依赖项注入框架会更好,但现在可以使用。
现在,为了测试,使用:
val service = mock[TempScalaService]
when(service.login("user", "testuser")).thenReturn(true)
您可以在对象扩展的特征中定义方法。然后简单地模拟特征:
trait Login {
def login(userName: String, password: String): Boolean
}
object TempScalaService extends Login {
def login(userName: String, password: String): Boolean = {
if (userName.equals("root") && password.equals("admin123")) {
return true
}
else return false
}
}
//in your test
val service = mock[Login]
您可以创建一个 Scala 伴随对象:
- 为您编写测试用例class。
- 让那个对象做外部世界的交互。