我在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)
}
}
}
我发现单元测试的主体不是来自我的模拟数据,而是来自真实的数据库。我该怎么办。
谢谢。
答案 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引用您的模拟实例。