gpt4 book ai didi

java - Scala 如何将模拟对象注入(inject) ScalatraFlatSpec

转载 作者:行者123 更新时间:2023-12-01 10:27:31 27 4
gpt4 key购买 nike

我在 Scala 中进行单元测试已经很多天了。我无法将模拟对象注入(inject)单元测试。 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)
}
}
}

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

谢谢。

最佳答案

您没有将模拟注入(inject) Dashboard ,所以Connection你在 getExecuteQuery 中看到是 ConnectionModel.connection 提供的。您可能希望使用依赖项注入(inject)框架或类似 Cake 模式的框架来确保您的仪表板引用您的模拟实例。

关于java - Scala 如何将模拟对象注入(inject) ScalatraFlatSpec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35284408/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com