2016-01-18 3 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

Итак, похоже, это не работает. Когда я пытаюсь это сделать, выполнение даже не входит в блокировку закрытия. Обновление моего сообщения, чтобы показать это. –