使用具有单位的规格

时间:2011-03-18 12:33:23

标签: scala specs scalatest unitils

我正在努力让scala规范和unitils-dbunit工作。

要使用单位,你必须注释你的 使用@RunWith测试类(classOf [UnitilsJUnit4TestClassRunner])或 从类扩展,您可以设置要加载的DataSet @DataSet(阵列( “DataSet.xml”))。所有这些都适用于JUnit。

但是在使用规格时我遇到了两个问题:

  • 我正在用gradle和ScalaTestAntTask运行我的specs测试,所以 我想@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))
            }
        }
    }

-  基督教

1 个答案:

答案 0 :(得分:3)

DataSet注释无法直接应用于"xxx" should,因为这不是测试方法,只是常规的scala代码调用。

我无法为您提供完全有效的解决方案,但您需要做的是挖掘出unitils API并直接使用DataSetFactory来加载您的数据。我认为您可以或多或少地重复使用here找到的代码。

然后,如果您需要在每个示例之前加载此数据集,只需使用doBefore调用。