Unit testing Grails单元测试还是集成测试?

Unit testing Grails单元测试还是集成测试?,unit-testing,testing,grails,junit,integration-testing,Unit Testing,Testing,Grails,Junit,Integration Testing,我不知道我想在Grails2.2.3应用程序中测试什么,是使用单元测试还是集成测试。我想针对以下内容运行一些测试: @TestFor(Student) @Mock(Student) class StudentTests { void testFoundStudent() { def s = Student.findById(myId) assert s != null assert s.firstName = 'Grant' as

我不知道我想在Grails2.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!=空
。这意味着它没有使用我们的数据库,因为它应该找到一个具有该ID的学生。

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

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

如果您试图再次测试
def s=Student.findById(myId)
,这不会增加任何值,因为这是Grails dynamic finder,您可能需要信任您正在使用的框架

然而,总的来说

单元测试通常在没有物理层的情况下运行 涉及I/O的资源,如数据库、套接字连接或 档案


我希望这有帮助

您的测试数据库是否在
test
环境下的
DataSource.groovy
中提到/使用过?另外,如果您使用的是
@TestFor(DomainClass)
,我认为您不需要
@Mock
注释
@TestFor
将为您进行模拟。您可以在哪里解决您的问题?那么,应用程序可能只需要集成测试吗?我想说,任何应用程序都应该至少进行单元、集成和功能测试。我宁愿有重叠覆盖,也不愿不覆盖。您选择了测试,这取决于您正在测试的模块的性质。简单而朴素的答案是,通过单元测试用单一功能覆盖较小的组件。然后使用集成测试覆盖他们的交互,最后使用功能测试覆盖更大的画面。我的类比是,你用单元测试放大和测试问题,缩小一点,用集成测试,完全缩小功能测试的问题。