2015-01-07 1 views
0

일반적인 서비스는 다음과 같습니다Guice를 사용할 때 모의 DAO 클래스를 설치하는 방법은 무엇입니까?

trait BaseService extends LazyLogging { 

    def getDb() = { 
    DatabaseHelper.getDb  // database for the scala slick library 
    } 

} 

abstract class UserService extends BaseService { 
    def getById(userId: Int): Option[User] 
} 

class UserServiceImpl @Inject(val userDao: UserDao) extends UserService = { 

    def getById(userId: Int): Option[User] = { 
    getDb().withSession { implicit session => 
     return userDao.getById(userId) 
    } 
    } 
} 

Guice 내가 좋아하는 내 개체 철사 사용 : 나는 scalatest를 사용하여 단위 테스트를 오전 때 나는 조금 혼란 스러워요, 을 지금

class ServiceModule extends ScalaModule { 
    def configure() { 
    bind[UserDao].to[UserDaoImpl] 

    bind[UserService].to[UserServiceImpl] 
    } 
} 

어떻게 내가 할 수있는 데이터베이스 응답을 모의하고 싶으므로 데이터베이스 접근을 끊으십시오.. 내 Guice을

class UserServiceSpec extends UnitSpec with MockitoSugar { 

val userService = injector.getInstance(classOf[UserService]) 


describe("UserServiceSpec") { 
    it("should do someting") { 
    val abc = userService.doSomething(); 
    abc.name should be("abc") 
    } 
} 


} 

내 UnitSpec 클래스 와이어 최대 :

내 스펙 등이 보인다.

모의 객체 (mockito 사용)는 어디에서 작성해야하며 Guice를 사용하여 어떻게 연결해야합니까? ServiceModule 또는?

내 BaseService가 데이터베이스에 연결되어 있기 때문에 디자인이 잘못되었습니다. 어떻게 든 리팩토링해야합니다.

나는이 나쁜 디자인에서 벗어날 방법을 찾고 있는데, 현재 아이디어가있는 것 같습니까?

+0

내가 guice + 스칼라 모르지만, 자바, 당신은 Modules.override를 (사용합니다에 UserDao를 mock (UserDao) 인스턴스에 바인드하는 모듈을 추가하십시오. –

+1

단위 테스트에서 Guice를 전혀 사용하지 않아도됩니까? 나는 그것을 할 것입니다. –

+0

@ TavianBarnes 가능하다, 생각하지 않았다. 또한 필자가 어떻게 든 배제해야하는 기본 서비스에 데이터베이스 풀이있는 문제가 있습니다. – Blankman

답변

0

db 연결을 DAO 계층으로 이동할 수 있습니다. 응용 프로그램에는 제어기 -> 서비스 -> DAO의 세 가지 레이어가 있어야합니다. 모든 서비스 계층은 DAO에 의해 제공되는 기능, 즉 CRUD 동작을 알아야한다. 그것은 DAO의 책임이기 때문에 DB 커넥션에 대해 아무 것도 모른다.

Slick 프레임 워크에 대해서는 잘 모르겠지만 Guice의 Play 프레임 워크에서는 응용 프로그램이 실행 중일 때 예상되는 "실제"바인딩 (주입 된 종속성)을 비활성화하고 이와 같은 테스트를위한 바인딩 만 사용 가능하게 설정할 수 있습니다 :

implicit override lazy val app = new GuiceApplicationBuilder() 
    .configure(appConfig) 
    .disable(classOf[ReactiveMongoModule], classOf[CommonModule]) 
    .bindings(bind(classOf[ReactiveMongoApi]).toInstance(api)) 
    .bindings(TestDaoModule()) 
    .build() 

이것은 완전한 통합 테스트 (컨트롤러 층)이 도움이되기를 바랍니다 :) https://github.com/luongbalinh/play-mongo/blob/master/test/controllers/UserControllerTest.scala