2016-09-12 2 views
4

나는 처음으로 캐쉬를 사용하고있다! 스칼라 2.5. 그것은 테스트를 제외하고는 잘 작동합니다.재생! 스칼라 2.5 : 캐싱을 주입하는 테스트 클래스가 오류로 연결됨

내가 캐시가 필요하지 않습니다하지만 난이 오류 (와 같은 일을 말하는 많은 다른 사람) 얻을 수 있기 때문에 내 테스트는 여전히 통과

:

Unable to provision, see the following errors: 

1) Error in custom provider, play.api.cache.EhCacheExistsException: An EhCache instance with name 'play' already exists. 

내가 오류를 이해하지만 관리하지 않았다을 내 자신의 캐시 API 버전을 구현 (모의하기 위해).

play mailing list에서 말한 내용을 시도했지만 성공하지 못했습니다 (모듈이 종속성 삽입이므로 Play! 2.4와 약간의 차이가 있습니다). 어떤 도움이라도 환영받을 것입니다.

편집 : 내가했던 (그리고 아무것도 변경되지 않습니다) 무엇을 (단지 시험)

내 CacheApi 버전 :

class MyCacheApi extends CacheApi { 
    lazy val cache = { 
    val manager = CacheManager.getInstance() 
    manager.addCacheIfAbsent("play") 
    manager.getCache("play") 
    } 

    def set(key: String, value: Any, expiration: Duration = Duration.Inf) = {} 

    def remove(key: String) = {} 

    def getOrElse[A: ClassTag](key: String, expiration: Duration = Duration.Inf)(orElse: => A): A = { 
    get[A](key).getOrElse { 
     val value = orElse 
     set(key, value, expiration) 
     value 
    } 
    } 

    def get[T: ClassTag](key: String): Option[T] = None 
} 

그리고 내 테스트에서

, 나는 그것을 사용을 같은 : I 클래스 FacebookAPI의 기능을 테스트있을 때

lazy val appBuilder = new GuiceApplicationBuilder() 
    .in(Mode.Test) 
    .overrides(bind[CacheApi].to[MyCacheApi]) 

lazy val injector = appBuilder.injector() 
lazy val cache = new MyCacheApi 
lazy val facebookAPI = new FacebookAPI(cache) 

을하지만, 테스트는 통과하지만, 난 여전히 잘못을 많이 가지고 "play"라는 이름의 EhCache 인스턴스가 이미 존재한다는 사실 때문에 ...

+0

[캐시의 현재 소스] (https://github.com/playframework/playframework/blob/2.5.6/framework/src/play-cache/src/main/scala/play/api/cache/) Cache.scala) [이 플러그인을 모듈로 이동하는 방법] (https://www.playframework.com/documentation/2.5.x/PluginsToModules) – Barry

+0

감사합니다. @ 배리하지만 정말 잘 모르겠습니다. 당신이 제공 한 링크로 무엇을 할 것인가. 내 편집보기;) – Simon

+0

어떤 테스트 라이브러리를 사용하고 있습니까? 이 통합 테스트입니까? – Barry

답변

2

마지막으로 해결책을 찾았습니다.

play.cache.bindCaches = ["controller-cache", "document-cache"] 

play.cache.createBoundCaches = false 

그리고 난 그냥 내 build.sbt의 설정 부분에 추가 시험에 사용이 conf의 파일을 만들 수있는 다음 :

나는 (conf의 폴더)를 test.conf 파일에 추가 줄 :

javaOptions in Test += "-Dconfig.resource=tests.conf" 

자세한 내용이 필요하면 알려주세요.

+0

이것은 나를 위해 작동하지 않습니다. 그것은 여전히 ​​예외를 throw합니다. 아마도 내 앱마다 다른 캐시가 있거나 Play (Java) – unjankify

0

이것은 테스트의 병렬 성 때문일 가능성이 큽니다. 예를 들어, specs2를 사용하고 있고 "WithApplication()"(play 2.5.x에서 응용 프로그램을 위조하기 위해)을 사용하는 두 개의 테스트가있는 경우 ehcache에 대한 오류가 발생합니다.

내 해결 방법은 다른 테스트를 실행하는 것이 었습니다. specs2의 경우 테스트 클래스 시작 부분에 "sequential"을 추가하면됩니다. 나는 "ScalaTestPlus"에서 그렇게하는 방법을 모르지만 요점을 얻습니다.

+0

이미 테스트 스위트 (OneAppPerSuite 포함) 당 하나의 응용 프로그램 만 사용하므로 테스트를 순차적으로 실행해도 아무 것도 변경되지 않습니다. 어쩌면 각 테스트 스위트를 하나씩 실행하는 솔루션이 있을지 모르겠지만 (아마도 당신입니까?).테스트가 병렬로 실행되는 것이 좋으므로 완벽한 해결책은 될 수 있지만 완벽하지는 않습니다. – Simon