Java Can';在play 2.5.x中找不到类play.api.cache.CacheApi的构造函数

Java Can';在play 2.5.x中找不到类play.api.cache.CacheApi的构造函数,java,scala,caching,playframework,Java,Scala,Caching,Playframework,我正在为类(MyWebSocketActor)中接受缓存作为其参数之一的特定方法(validate)进行单元测试 为此,我需要创建一个缓存实例。play.api.cache.CacheApi是一种特性,因此无法实例化。所以我用@Inject在这个单元类中传递(cache:CacheApi)。但是它给出了错误消息:找不到play.api.cache.CacheApi类的构造函数。我使用的是play 2.5.3和scala 2.11.x。您需要模拟CacheApi(或者以其他方式创建它),而不是使用

我正在为类(MyWebSocketActor)中接受缓存作为其参数之一的特定方法(validate)进行单元测试


为此,我需要创建一个缓存实例。play.api.cache.CacheApi是一种特性,因此无法实例化。所以我用@Inject在这个单元类中传递(cache:CacheApi)。但是它给出了错误消息:找不到play.api.cache.CacheApi类的构造函数。我使用的是play 2.5.3和scala 2.11.x。

您需要模拟
CacheApi
(或者以其他方式创建它),而不是使用依赖注入

有一个很好的例子说明了如何做到这一点:

package test

import javax.inject._
import org.specs2.mutable._
import play.api.test.Helpers._
import play.api.test._
import play.api.libs.json._
import play.api.cache._
import akka.stream._
import akka.actor._
import akka.actor.Actor
import akka.actor.ActorSystem
import akka.actor.ActorRef
import akka.actor.Props
import akka.pattern.ask
import models.MyWebSocketActor
import scala.collection.mutable.Map 
import org.specs2.mock._
import play.api.mvc._

class ValidateMethodTest @Inject() (cache: CacheApi) extends Specification with Mockito {





  val system = ActorSystem("MockActorSystem")
  val mockMap : Map[ActorRef , String] = Map()


  "validator method" should {

      "check username key" in {

        /*with no username key */
  val testMsg1 =  Json.parse("""{"message":"Testing Message" ,"conn_status" : 2 , "pub_key":"empty", "target":"all"}""")

 val actor1 = system.actorOf(Props[MyWebSocketActor],"actor1")



  val actor2 = system.actorOf(Props[MyWebSocketActor],"actor2")




  val mockObject1 = new MyWebSocketActor(actor1,actor2,cache,mockMap)

  val ( mockReturnMsg, mockReturnCode, mockPub_key) = mockObject1.validate(testMsg1)


     mockReturnCode must equalTo(500) 
    }

  }


}

不要依赖注入
CacheApi
。取而代之的是嘲弄它。如何嘲弄?请解释。对不起,但我仍然不确定,我将如何在这里安装缓存。实际上,
类MyWebSocketActor(out:ActorRef,PostActorRef:ActorRef,cache:CacheApi,PostactorUserNameAP:Map[ActorRef,String])
就是我的WebSocketActor类的样子。那么它将如何将mockobject标识为CacheApi的引用呢?类似这样:
val mockedCache=mock[CacheApi]
然后
val mockObject1=new MyWebSocketActor(x,y,myCacheApi,z)
并且您可能还希望为缓存定义一些行为。例如,总是返回None。嘿,如果我在执行mockedCache.get(“somekey”)时返回None,它仍然不起作用并给出异常。我怀疑如果我希望返回选项[String]的'None'或代替某些(“somevalueExpected”)。这两个选项都不起作用,我应该写些什么。
import org.specs2.mock._
import org.specs2.mutable._

import java.util._

class ExampleMockitoSpec extends Specification with Mockito {

  "MyService#isDailyData" should {
    "return true if the data is from today" in {
      val mockDataService = mock[DataService]
      mockDataService.findData returns Data(retrievalDate = new java.util.Date())

      val myService = new MyService() {
        override def dataService = mockDataService
      }

      val actual = myService.isDailyData
      actual must equalTo(true)
    }
  }

}