私はscalaで独自のデータベースを書いています。結果が正しいことを確認するために、specs2仕様内のMySQLを確認します。私は正しい結果を得ることができ、すべてがうまくいきます。しかし、変更を加えずにテストを再実行すると、が得られますSQLException: No suitable driver found for jdbc:mysql://localhost:3306/DBNAME?user=DBUSER (null:-1)
。ドライバーが再度ロードされないのはなぜですか?
編集
import java.sql.{ Connection, DriverManager, ResultSet }
import org.specs2.mutable.Specification
// SDDB imports ...
class DBValidationSpec extends Specification {
"SDDB and MySQl" should {
// SDDB
// ...
// JDBC
val connectionString = "jdbc:mysql://localhost:3306/sddb_test?user=root"
val query = """SELECT content, SUM( duration ) duration
FROM test
WHERE times
BETWEEN '2011-12-08'
AND '2011-12-09'
GROUP BY content"""
classOf[com.mysql.jdbc.Driver]
"give the same result" in {
// ...
//sddbResult
lazy val conn = DriverManager.getConnection(connectionString)
try{
val rs = conn.createStatement().executeQuery(query)
var mysqlResult = Map[List[String], Int]()
while (rs.next) {
mysqlResult += (rs.getString("content") :: Nil) -> rs.getInt("duration")
}
sddbResult == mysqlResult && sddbResult.size == 478 must beTrue
} finally {
conn.close()
}
}
}
}
コードの一部は質問に属していないため、省略しました。
編集#2
問題はさらに奇妙になりました。2つ目のテストケースを追加しました。テストケースは同じを使用しconnectionString
ます。例外は1回だけ発生しました。2番目のテストは成功しました。sequential
テスト定義に追加したところ、最初に実行されたテストのみが例外を発生させることがわかりました。classLoader
その後、同じものかどうかを確認するためにトレースしました。です。
次の回避策を実行しました。
trait PreExecuting extends Before {
override def before {
var conn: Option[Connection] = None
try {
val connectionString = "jdbc:mysql://localhost:3306/sddb_test?user=root"
conn = Some(DriverManager.getConnection(connectionString))
} catch {
case _ =>
} finally {
conn map (_.close())
}
}
}
PreExecution taitを使用して例外を抑制したため、例外は発生しなくなりました。しかし、私はまだここで何が間違っているのか疑問に思います。