Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Mockito模拟Scala对象中的函数?_Scala_Mockito_Scalatest - Fatal编程技术网

如何使用Mockito模拟Scala对象中的函数?

如何使用Mockito模拟Scala对象中的函数?,scala,mockito,scalatest,Scala,Mockito,Scalatest,我对Scala真的很陌生。我试图用Mockito模拟一个简单的Scala函数,但是我得到了以下错误。我已经上网查过了,但找不到错误 object TempScalaService { def login(userName: String, password: String): Boolean = { if (userName.equals("root") && password.equals("admin123")) { return true }

我对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 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$1.apply$mcV$sp(Transformer.scala:    22)
    at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)

无法模拟对象,请尝试将代码移动到类:

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伴生对象:

  • 为您的类编写测试用例
  • 让那个物体做外部世界的交互
    Scala中的字符串不需要使用
    .equals()
    。试试看:
    “hi”==新字符串(“hi”)
    为真。另外,
    if(condition){return true}else return false
    可以缩短为只
    返回condition
    甚至
    condition