Как тестировать классы с внедрением зависимостей - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть класс "Сервис", и мне нужно проверить его методы.Я не могу понять, как получить доступ к методам класса "Сервис" из тестов.

Я пытался сделать это:

package services

import scala.concurrent.{ExecutionContext, Future}

import com.google.inject.Inject
import models.{News, State}
import org.scalatest.{MustMatchers, WordSpec}

class NewsServiceTest @Inject()(
  newsService: NewsService
)(implicit val ec: ExecutionContext) extends WordSpec with MustMatchers {

  "News controller" must {
    "find all must return sequence with news-object" in {
      val news = News(
        id = 1,
        title = "renamed test title 2",
        short_title = Some("r t s t 2"),
        text = "here is some text about my life and other beautiful things."
      )
      val result: Future[Seq[News]] = newsService.findAll(Some(State.Active))

      result.map(a => a must contain (news))
    }
  }
}

, но это не работает

Класс Сервис

class NewsService @Inject()(newsDAO: NewsDAO)(implicit ec: ExecutionContext) {

  def findAll(stateO: Option[State.Value]) = {
    stateO.map(newsDAO.find).getOrElse(newsDAO.findAll)
  }

  def findOne(id: Long) = {
    newsDAO.findOne(id).toEither(InternalDatabaseError.NotFound(classOf[News]))
  }

  def delete(id: Long) = {
    newsDAO.delete(id)
  }

//and other methods
}

1 Ответ

1 голос
/ 26 апреля 2019

Инъекционная структура (Google Guice) не запускается в тестах, если ваши экземпляры не будут внедрены, и это то, что вы в любом случае хотите.

В этом случае, если вы хотите протестировать службу NewsService, вы, вероятно, захотите внедрить специальный DAO, где вы управляете выходами, чтобы вы могли проверить, как работает NewsService, например, при отсутствии новостей.

Просто создайте службу NewsService в своем тесте с помощью тестового DAO (или вы можете использовать mockito).

class NewsServiceTest extends WordSpec with MustMatchers {
   class EmptyTestDAO extends NewsDAO { 
       def getNews(): List[News] = List.empty

   }


"News controller" must {
   "return an empty list when there is no news" in {
      val service = new NewsService(new EmptyTestDAO)
      service.findAll() shouldBe List.empty
    }
 }
}

Если вы хотите использовать mockito вместо написания пользовательских DAO, вы должны сделать что-то вроде этого

val dao = Mockito.mock(classOf[NewsDAO])
Mockito.when(dao.getNews()).thenReturn(List.empty[News])
val service = new NewsService(dao)

Существует синтаксический сахар для скалы с MockitoSugar

...