3

私はscalaの仕様とunitils-dbunitを機能させようとしています。

ユニティルを使用するには、テストクラスに@RunWith(classOf [UnitilsJUnit4TestClassRunner])でアノテーションを付けるか、クラスから拡張する必要があり、@ DataSet(Array( "DataSet.xml"))でロードするようにDataSetを設定できます。これはすべてJUnitで機能します。

しかし、スペックを使用すると2つの問題が発生しました。

  • gradleとScalaTestAntTaskを使用してスペックテストを実行しているので、@RunWithアノテーションは無視されると思います。
  • ここに示すように、@DataSetアノテーションをテストメソッドに設定できません。

    [...]
    @RunWith(classOf[UnitilsJUnit4TestClassRunner])
    class DaoTest extends Specification with ScalaTest {
    
        @TestDataSource
        var dataSource: DataSource = null
    
        @DataSet(Array("DataSet.xml"))
        "querying the database" should {
            "return the right data" in {
                [assertSomething]
            }
        }
    }
    

これにより、次のコンパイラエラーが発生します。

エラー:定義の開始が予想されます

「データベースのクエリ」は{

^

スペックとユニティルを一緒に使用する方法を誰かが知っていますか?

更新:これは私が思いついた解決策です:

    import org.specs.runner.ScalaTest
    import org.specs.Specification
    import org.unitils.dbunit.DbUnitModule
    import java.io.File
    import java.util.Properties
    import org.unitils.core.ConfigurationLoader

    class DaoTest extends Specification with ScalaTest {

        "querying the database" should {

            doBefore {
                UnitilsDatabaseUtils.setup("DataSet.xml", "DataSet2.xml")
            }

            "return the right data" in {
                [test something]
            }
        }
    }

    object UnitilsDatabaseUtils {

        def setup(dataSetFileNames: String*) = {
            val configuration: Properties = new ConfigurationLoader().loadConfiguration
            val dbunitModule = new DbUnitModule
            dbunitModule.init(configuration)

            for (dataSetFileName <- dataSetFileNames) {
                val dataSetURL = getClass.getClassLoader.getResource(dataSetFileName)
                dbunitModule.insertDataSet(new File(dataSetURL.toURI))
            }
        }
    }

- キリスト教徒

4

1 に答える 1

3

"xxx" shouldこれはテストメソッドではなく、通常のscalaコード呼び出しであるため、DataSetアノテーションを直接適用することはできません。

完全に機能するソリューションを提供することはできませんが、必要なのは、unitils APIを掘り下げ、DataSetFactoryを直接使用してデータをロードすることです。ここにあるコードは多かれ少なかれ再利用できると思います。

次に、各例の前にこのデータセットをロードする必要がある場合は、doBefore呼び出しを使用してください。

于 2011-03-20T23:39:43.670 に答える