如何使grails中的一对一关系测试失败?

时间:2010-12-25 08:21:41

标签: hibernate grails groovy

我想在grails中建立一对一的关系并测试它。所以我创建了两个类。

下面有两个课程。


class Book {

  String title
  Date releaseDate
  String ISBN

  static belongsTo = [person:Person]
}

class Person {

  Book book;

  String name
  Integer age
  Date lastVisit

  static constraints = {
    book unique: true  // "one-to-one". Without that = "Many-to-one".
  }

}

写下测试:


public void testOneToOne() {
 Person person1 = new Person(name:"person_b1", age: 99, lastVisit: new Date())
      Person person2 = new Person(name:"person_b2", age: 100, lastVisit: new Date())

      Book oneBook = new Book(title:"somebook", ISBN: "somebook1", releaseDate: new Date())

      person1.setBook(oneBook)
      person1.save()

      person2.setBook(oneBook)
      person2.save()  // ! c'est impossible pour 'one-to-one'
}

因此,如果这是一对一的,我无法将person2保存到db,因为一本书无法链接到多个人。那么当person2.save()那么我有异常吗?

我没有。并且person2没有保存到db。那么我该如何测试 - 如何使测试失败?

1 个答案:

答案 0 :(得分:0)

unique约束用于确保类的一个实例只能连接到另一个类的单个实例: http://grails.org/doc/latest/ref/Constraints/unique.html

在您的示例中,您将Book的一个实例加入到两个Person实例中,即一对多关联 - 因此保存失败是有道理的。如果您检查person2.errors.allErrors属性,则应该看到违反了Person.book.unique约束。

这就是一对一关联测试的样子 - person2需要她自己的书,因为你宣称一本书只能属于一个unique约束的人。

   public void testOneToOne() {
        Person person1 = new Person(name:"person_b1", age: 99, lastVisit: new Date())
        Person person2 = new Person(name:"person_b2", age: 100, lastVisit: new Date())

        Book oneBook = new Book(title:"somebook", ISBN: "somebook1", releaseDate: new Date())
        Book twoBook = new Book(title:"anotherbook", ISBN: "somebook2", releaseDate: new Date())

        person1.setBook(oneBook)
        assertNotNull(person1.save())

        person2.setBook(twoBook)
        assertNotNull(person2.save())
  }

看起来你真的想要一个(书)到很多(人)关联,所以只需要保留unique约束。