Scala如何将模拟对象注入ScalatraFlatSpec

时间:2016-02-09 05:16:03

标签: java scala unit-testing scalatra

我在Scala中坚持使用Unit测试很多天了。我不能将模拟对象注入单元测试。 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)
        }
    }
}

我发现单元测试的主体不是来自我的模拟数据,而是来自真实的数据库。我该怎么办。

谢谢。

1 个答案:

答案 0 :(得分:1)

您没有将模拟注入Dashboard,因此您在Connection中看到的getExecuteQuery是由ConnectionModel.connection提供的 $cat = 226; global $wpdb; switch ($cat) { case "228": // アクセサリー case "226": // バッグ case "224": // 衣服 case "231": // 帽子・スカーフ case "229": // ジュエリー case "262": // 雨具 case "227": // 靴 case "230": // 生地 case "232": // 腕時計 $wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '225')"); // アパレル&アクセサリー break; case "252": // カー部品 $wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '251')"); // カー用品 break; case "266": // 家電 case "222": // オーディオ・映像装置 case "221": // その他のデジタル製品 $wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '17')"); // デジタル製品&家電 break; case "204": // 乾燥食品 case "197": // 飲料品 case "203": // 青果品 case "206": // 肉類 case "199": // 面類・米&小麦 case "202": // ソース類 case "201": // スパイス・調味料類 case "200": // お菓子・スナック類 case "205": // 野菜類 $wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '198')"); // 飲食料品 break; case "218": // 浴槽製品 case "220": // 家具 case "216": // キッチン用具・食器 case "219": // 伝統工芸品 case "272": // 雑貨 $wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '217')"); // 家具・キッチン用具・食器 break; case "254": // すべての農作製品 $wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '253')"); // 農作製品 break; case "236": // アニメ製品 case "237": // ギフト製品 case "234": // 玩具 $wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '235')");: // ギフト・玩具・アニメ製品 break; case "214": // 美容器具・製品 case "208": // 化粧品 case "211": // 香水 case "212": // スキンケア製品 case "213": // 石鹸・洗髪料 case "210": // サプリメント・ビタミン $wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '209')"); // 健康・美容製品 break; case "250": // 工業製品 case "248": // 建設資材 case "247": // 床材 case "264": // 水周り製品 $wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '249')");: // 工業・建設資材&製品 break; case "269": // エネルギー・ソーラー case "245": // 照明 $wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '244')"); // 照明・エネルギー break; case "242": // 芸術品 case "243": // 高級ステレオ $wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '241')"); // 高級製品 break; case "261": // 医療品・医薬品 case "267": // 化学製品 case "268": // 研究器具 $wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '260')"); // 医療品・化学製品・研究器具 break; case "240": // オフィス用品 case "263": // スクラッチカード case "169": // 文房具 $wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '238')"); // オフィス什器・文房具 break; case "259": // スポーツ器具 case "256": // スポーツウェア case "258": // 運動補助器具 $wpdb->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ('".$post_id."', '257')"); // スポーツ関連 break; default } 。您可能希望使用依赖注入框架或Cake模式之类的东西来确保您的Dashboard引用您的模拟实例。