문제

내 일(밀라노)코드 플레이에서 사용하는 JPA DB 액세스입니다.잘 작동합니다.그러나 나는 원하는 장치를 테스트 코드를 사용하여 필요한 모 entitymanager 를.이것이 가능한가요?

내가 테스트에 기록된 specs2(을 확장하여 PlaySpecification)실행과 JUnit.내가 사용하 Mockito 모 entitymanager 를.그러나 나는 것입할 수 있을 것으로 기대하는 이렇게 다른 프레임워크에서.

여기에 무엇이 내 코드는 다음과 같:

object MyThing {
    def create(...) : MyThing = {
        val newThing = ...
        JPA.withTransaction(new play.libs.F.Function0[Unit]() {
            def apply() = {
                JPA.em().persist(newThing)
            }
        })
        return newThing
    }
}

가능하지 않은 경우의 단위에 이 코드를 테스트,거기에 몇 가지 다른 방법은 데이터 액세스 권장되는?

도움이 되었습니까?

해결책

분명히 방법이 없을 사용하여 모의 entitymanager 를 여기에,적어도 찾을 수 없음.그래서 나는 수정 나의 디자인이다.

는 것을 통해 다른 이들의 특징이 제안을 만드는 별도 DB 로 옮겨진 개인 끈기로젝트에는 메일링 리스트: https://groups.google.com/d/msg/play-framework/1u-_JbTIuQg/L5_9o4YCfoMJ.사 매우는,그러나 나는 솔루션을 찾을 나를 위해 일했을 정의하여 별도의 DAO 인터페이스입니다.

저는 모든 JPA 코드로 DAO 특성-모든 구현은 거기에있다.또한 동반자를 제공하는 것을 목적으로 하는 단일 인스턴스입니다.그래서 다음과 같:

trait MyThingDAO {
    def create(...) : MyThing = { ... }
}
object MyThingDAO extends MyThingDAO

이제 내용을 변경하기 위해 컨트롤러의 특성과에 대한 참조를 DAO 왼쪽 설정이 되어 있지 않습니다.동반자 객체를 설정합니다 DAO 인스턴스를 단일 객체입니다.이러한 방법을 변경하는 경로 파일(필요가 없 인스턴스화하는 컨트롤러).그래서 다음과 같:

trait MyThingController {
    val myThingDao : MyThingDAO
    def myAction = Action { implicit request => ... }
}
object MyThingController {
    val myThingDao = MyThingDAO
}

그래서 모든 작품을 쉽게 충분 표준 JPA 때 코드를 사용합니다.하지만 내가 원하는 때 단위 테스트,나는 삽입할 수 있는 모의 DAO 그래서 같은(이용 Mockito):

...
val mockDao = mock[MyThingDAO]
val controller = new MyThingController() { val myThingDao = mockDao }
...

어쩌면 이것은 없는 이상적인 접근 방식이지만,그것이 일하고있다.나는 여전히 관심을 듣고 다른 어떤 제안을 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top