【问题标题】:How to testing classes with dependency injection如何使用依赖注入测试类
【发布时间】:2019-04-26 20:56:57
【问题描述】:

我有“服务”类,我需要测试它的方法。我不明白如何从测试中访问“Service”类的方法。

我试过这样做:

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
}

【问题讨论】:

    标签: scala playframework scalatest


    【解决方案1】:

    注入框架(google guice)没有在测试中启动,你的实例不会被注入,这就是你想要的。

    在这种情况下,如果您想测试您的 NewsService,您可能需要注入一个特殊的 DAO 来控制输出,这样您就可以在没有新闻的情况下测试 NewsService 如何工作。

    只需使用您的测试 DAO 在您的测试中创建一个 NewsService(或者您可以使用 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的scala语法糖

    【讨论】:

    • 非常感谢您的帮助。我怎么能做同样的事情,但使用 mockito?
    • “没有消息时返回一个空列表”在 {,我认为
    • 你是对的,但我对代码并不严格,所以不要尝试复制粘贴(尽管无论是否编译,这总是有效的)。将代码用作指南
    猜你喜欢
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多