2016-01-18 28 views
4

我的一些控制器的依賴於數據庫連接和結構如下:是否有可能模擬數據庫連接進行功能測試,以及如何?

def getAll(revId: Muid) = Action { implicit request => 
     DB.withConnection { implicit connection => 
... 

我想爲它創建一個單元測試,所有嘲笑依賴性,包括連接爲好。現在,依賴關係的注入很容易通過Guice完成。但是,我正在努力尋找一種方法來模擬隱式連接。最終,測試正在試圖連接到我的默認數據庫。

鑑於這種情況,甚至有可能嘲笑暗示,以及如何?

UPDATE

所以,用這個東西了,而玩後,我得到了以下內容: 我的測試類:

class ChecklistCreationScheduler @Inject()(jobScheduler: JobScheduler, 
              dBApi: DBApi, 
              futureChecklistRepository: FutureChecklistRepository) extends ClassLogger{ 
def scheduleSingleFutureChecklistJob(futureChecklistId: Muid): Unit = { 
    logger.info(s"Preparing to schedule one time future checklist job for future checklist id '${futureChecklistId.uuid}'") 
    val db = dBApi.database("default") 
    logger.info("Database" + db) 
    db.withConnection { implicit connection => 
     logger.info("Connection" + connection) 
     ... 
    } 
} 
} 

而且測試:

"ChecklistCreationScheduler#scheduleSingleFutureChecklistJob" should { 
     "schedule a single job through a scheduler" in { 
     val futureChecklistId = Muid.random() 

     val jobScheduler = mock[JobScheduler] 

     val connection = mock[Connection] 
     val DB = mock[Database] 
     DB.getConnection returns connection 

     val dbApi = mock[DBApi] 
     when(dbApi.database("default")).thenReturn(DB) 

     val futureChecklistRepository = mock[FutureChecklistRepository] 
     doReturn(Option.empty).when(futureChecklistRepository).getById(futureChecklistId)(connection) 

     val chCreationScheduler = new ChecklistCreationScheduler(jobScheduler, dbApi, futureChecklistRepository) 

     chCreationScheduler.scheduleSingleFutureChecklistJob(futureChecklistId) must throwA[UnexpectedException] 
     } 
    } 

當我執行測試時,似乎執行甚至沒有進入withConnection的塊。 (我從來沒有去過這條線:logger.info("Connection" + connection))。

任何想法?

+0

你可以看看[Acolyte](http://acolyte.eu.org/) – cchantep

+0

你真的需要嘲笑連接嗎?或者你需要嘲笑'withConnection'調用返回的內容嗎?另外,你真的需要這個單元測試嗎? – marcospereira

+0

好吧,我只想要注入我自己的模擬「隱式連接」。至於單元測試,我試圖避免完整的集成測試。 –

回答

3

這裏是你如何使用Dependency Injection輕鬆地嘲笑數據庫調用:

考慮到這是你的控制器:

package controllers 

import javax.inject.Inject 

import play.api._ 
import play.api.db.Database 
import play.api.mvc._ 

class Application @Inject() (database: Database) extends Controller { 

    def index = Action { implicit request => 
    database.withConnection { implicit connection => 
     ??? 
    } 
    Ok(views.html.index("Your new application is ready.")) 
    } 
} 

你可以寫一個Specification like this

import java.sql.Connection 

import controllers.Application 
import org.specs2.mutable._ 
import org.specs2.runner._ 
import org.junit.runner._ 
import org.specs2.mock._ 
import play.api.db.Database 
import play.api.mvc.RequestHeader 

@RunWith(classOf[JUnitRunner]) 
class ApplicationSpec extends Specification with Mockito { 

    "Application" should { 

    "index page" in { 
     val connection = mock[Connection] 
     val database = mock[Database] 
     database.getConnection returns connection 

     val controller = new Application(database) 

     // You will also need to mock the request 
     // so that you can add the expected behavior 
     val request = mock[RequestHeader] 
     val result = controller.index(request) 

     // do some assert about your result 
     result must not beNull 
    } 
    } 
} 

當然,其他一些模擬可能需要處理您的(整個)用例。

+0

所以,顯然,這並不是真的有效。當我嘗試這樣做時,執行甚至不會進入關閉塊。更新我的帖子以顯示。 –

相關問題