3

我不知道对我想要在我的 Grails 2.2.3 应用程序中测试的内容使用单元测试还是集成测试。我想像这样运行一些测试:

@TestFor(Student)
@Mock(Student)
class StudentTests {

void testFoundStudent() {
        def s = Student.findById(myId)
        assert s != null
        assert s.firstName = 'Grant'
        assert s.lastName = 'McConnaughey'
    }
}

这将需要使用我们的测试数据库,那么它会成为集成测试吗?当我将此代码作为单元测试运行时,它在assert s != null. 这意味着它没有使用我们的数据库,因为它应该找到具有该 ID 的学生。

4

1 回答 1

5

在 Grails 单元测试中,您可以使用 Gorm 测试域类交互,并且在后台 Grails 将使用内存数据库(ConcurrentHashMap 的实现)来模拟此行为。所以是的,您得到 null 因为该学生在内存数据库中不存在,您需要先插入该数据。

Student.findOrSaveWhere (firstName: 'Grant',lastName : 'McConnaughey')

在您的示例中,如果打算测试该数据的存在,您需要使用集成测试并将其连接到您的数据库datasource.groovy,除非您有充分的理由测试您的数据,否则这真的不是一个好主意。

如果您尝试def s = Student.findById(myId)再次进行测试,那不会增加任何价值,因为那是 Grails 动态查找器,您可能需要信任您正在使用的框架。

然而,总的来说

单元测试通常在不存在涉及 I/O 等数据库、套接字连接或文件链接的物理资源的情况下运行

我希望这有帮助

于 2013-07-15T15:34:27.460 回答