Grails单元或集成测试?

gra*_*hey 3 testing grails junit integration-testing unit-testing

我不知道是否要在我的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'
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ali*_*dad 5

在Grails的单元测试可以测试使用格姆域类交互和幕后Grails将使用内存数据库(即ConcurrentHashMap的实现),以模仿这种行为在这里.所以是的,你得到null,因为该学生不存在于内存数据库中,您需要先插入该数据.

Student.findOrSaveWhere (firstName: 'Grant',lastName : 'McConnaughey')
Run Code Online (Sandbox Code Playgroud)

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

如果您尝试def s = Student.findById(myId)再次测试没有添加任何值,因为这是Grails动态查找器,您可能需要信任您正在使用的框架.

但是,总的来说

单元测试通常在没有涉及I/O的物理资源(如数据库,套接字连接或文件链接)的情况下运行

我希望这有帮助