簡體   English   中英

Scala如何將模擬對象注入ScalatraFlatSpec

[英]Scala how to inject mock object to ScalatraFlatSpec

我在Scala堅持單元測試很多天了。 我無法將模擬對象注入單元測試。 對實際數據庫的ScalatraFlatSpec調用不是我的模擬變量,我也不知道要做什么。

這是我的API

class Dashboard extends Servlet {

  get("/:brand_code") {
    val start = System.currentTimeMillis
    val brandCode = params.get("brand_code").get
    var brandId = 0;
    val sqlFind = "SELECT DISTINCT(id) FROM brands WHERE brand_code=?"
    val found:List[Map[String, Any]] = ConnectionModel.getExecuteQuery(sqlFind, List(brandCode))
    if(found.isEmpty){
       halt(404, send("error", s"brand_code [$brandCode] not found."))
    }else{
       brandId = found(0).getOrElse("id", 0).toString.toInt

       send("Yeah55", brandId)
    }
}

這是Servlet

abstract class Servlet extends ScalatraServlet with CorsSupport with     JacksonJsonSupport {
  protected implicit lazy val jsonFormats: Formats =     DefaultFormats.withBigDecimal
  protected override def transformResponseBody(body: JValue): JValue = body.underscoreKeys

  protected lazy val body = parsedBody.extract[Map[String, Any]]
  protected def send(message: String, data: Any = None) = Map("message" -> message, "data" -> data)

  options("/*") {
  response.setHeader(
      "Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers")
   )
 }

 before() {
   contentType = formats("json")
 }
 }

這是ConnectionModel和ConnectionModelAble

trait ConnectionModelAble {
  def getExecuteQuery(sql: String, parameters: List[Any]): List[Map[String, Any]]
}

object ConnectionModel extends ConnectionModelAble{
    var connection:Connection = {
    val url = "jdbc:mysql://localhost:3306/db"
    val username = "root"
    val password = ""\

    Class.forName("com.mysql.jdbc.Driver")

    DriverManager.getConnection(url, username, password)
  }


def getExecuteQuery(sql: String, parameters: List[Any]): List[Map[String, Any]]= {
  try {
     val statement = connection.createStatement()
     var preparedStatement: PreparedStatement = connection.prepareStatement(sql);
     var formatDate: DateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");


     // Do some execute
      for (i <- 0 until parameters.size) {
    parameters(i) match {
      case _: Int => preparedStatement.setInt(i + 1, parameters(i).toString.toInt)
      case _: Double => preparedStatement.setDouble(i + 1, parameters(i).toString.toDouble)
      case _: Date => preparedStatement.setDate(i + 1, new java.sql.Date(formatDate.parse(parameters(i).toString).getTime))
      case default => preparedStatement.setString(i + 1, parameters(i).toString)
    }
  }

    val resultSet = preparedStatement.executeQuery()

  val metaData: ResultSetMetaData = resultSet.getMetaData();
  val columnCount = metaData.getColumnCount();

  var ret: List[Map[String, Any]] = List();

  while (resultSet.next()) {
    var row: Map[String, Any] = Map[String, Any]();
    for (i <- 1 to columnCount) {
      val columnName = metaData.getColumnName(i);
      var obj = resultSet.getObject(i);
      row += columnName -> obj
    }
    ret = ret :+ row
  }

  ret

}catch {
  case e: Exception => {
    e.printStackTrace();
    List()
  }
}

}

這是我的單元測試

class DashboardSpec extends ScalatraFlatSpec with MockitoSugar {

    addServlet(new Dashboard, "/v1/dashboard/*")
      it should "return get dashboard correctly" in {
        val brandCode = "APAAA"
        val brandId = 157

        get("/v1/dashboard/APAAA") {
           val connectModel = mock[ConnectionModelAble]

           val sqlFind = "SELECT DISTINCT(id) FROM brands WHERE brand_code=?"
           Mockito.when(connectModel.getExecuteQuery(sqlFind, List(brandCode))).thenReturn(
    List(Map("id" -> 150))
  )
           assert(status == 200)
           println(connectModel.getExecuteQuery(sqlFind, List(brandCode)))
           println(body)
        }
    }
}

我發現單元測試的主體不是來自我的模擬數據,而是來自真實的數據庫。 我該怎么辦。

謝謝。

你是不是你注射模擬到Dashboard ,使Connection你在看到getExecuteQuery是提供一個ConnectionModel.connection 您可能想要使用依賴項注入框架或類似Cake模式的工具來確保儀表板引用了您的模擬實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM