Grails的。单元测试中的模拟数据可在集成测试中使用

时间:2011-05-21 08:30:32

标签: unit-testing grails groovy integration-testing

由于测试污染导致集成测试失败(测试通过或失败,具体取决于它们运行的​​顺序)。

令我感到困惑的是,似乎我用mockDomain(Media.class,[new Movie(...)])模拟了一些数据的单元测试仍然存在并且可用于其他测试,甚至是集成测试。

这是预期的行为吗?为什么测试框架不会在每次测试后自行清理?

修改

非常奇怪,文档说明:

  

集成测试与单元测试的不同之处在于您可以完全访问测试中的Grails环境。 Grails将使用内存中的HSQLDB数据库进行集成测试,并在每次测试之间清除数据库中的所有数据。

然而,在我的集成测试中,我有以下代码

    protected void setUp() {
      super.setUp()
      assertEquals("TEST POLLUTION!",0,Movie.count())
      ...
    }

这给了我输出:

TEST POLLUTION! expected:<0> but was:<1>

意味着在不存在数据时存在数据!

查看Movie.list()中存在的数据,我发现数据对应于先前测试中的数据集(单元测试)

protected void setUp() {
    super.setUp()

    //mock the superclass and subclasses as instances
    mockDomain(Media.class,[
            new Movie(id:1,name:'testMovie')
    ])
    ...
}

为什么我会遇到这些问题?

1 个答案:

答案 0 :(得分:1)

污染也可能存在于测试数据库中。检查DataSources.groovy以查看测试环境的用途。如果你将它设置为使用数据库在哪里 dbCreate设置为"create-drop"之外的其他内容,数据库的任何先前内容也可能会显示。

如果是这种情况,污染来自完全不同的来源。它实际上来自数据库,而不是来自单元测试,但是当切换到运行集成测试时,您将连接到包含其包含的所有数据的真实数据库。

我们遇到了这个问题,因为我们的测试环境设置为dbCreate"update"。这个为集成测试设置的原因让我很困惑,所以我转而使用dbCreate作为"create-drop",并确保在运行测试套件时我们开始使用干净的数据库。