1

我是 Groovy & Grails 的新手。我正在研究 Grails 中的示例一对多关系之一。

下面是代码。

class User {

    //properties
    String login
    String password
    String role

    //constraints and order of display of fields in UI
    static constraints = {
        login(blank: false, nullable: false, unique: true)
        password(blank: false, nullable: false, password: true)
        role(inList:["Admin", "Member"])
    }

    static hasMany = [posts : Post]
}


class Post {
    String content
    Date dateCreated

    static constraints = {
        content(blank: true)
    }

    static belongsTo = [user : User]
}

我在 Groovy 中的测试类

@TestFor(User)
class UserTests {

    void testUserToPost() {

        def user = new User(login: "joe", password: "joe", role:"Admin")
        user.addToPosts(new Post(content: "First"));
        user.addToPosts(new Post(content: "Second"));
        user.addToPosts(new Post(content: "Third"));
        user.save(flush: true)
        assertEquals 3, User.get(user.id).posts.size()

    }
}

运行测试类时,出现以下异常:

groovy.lang.MissingMethodException: No signature of method: com.library.forum.User.addToPosts() is applicable for argument types: (com.library.forum.Post) values: [com.library.forum.Post : (unsaved)]
Possible solutions: getPosts() at com.library.forum.UserTests.testUserToPost(UserTests.groovy:17)

谁能告诉我代码中的问题在哪里。

4

2 回答 2

4

从 Grails 2.1.4 开始,由于性能问题,模拟行为发生了变化。所以你需要模拟被模拟实体的所有关联实体。

请参阅 GRAILS-9637 - 由于性能问题,@Mock 不再模拟被模拟实体的关联实体。这些必须手动指定。例如,以下测试将在 2.1.4 及更高版本中失败:

@Mock(Author)
void testAddToBooks() {
    def a = new Author()
    a.addToBooks(new Book())
}

要纠正上述测试,您需要同时模拟 Author 和 Book:

@Mock([Author, Book])
void testAddToBooks() {
    def a = new Author()
    a.addToBooks(new Book())
}

你可以检查这个参考

于 2013-07-30T03:14:12.007 回答
1

您需要模拟所有相关的域类。改变 :

@TestFor(User)
class UserTests {

@TestFor(User)
@Mock(Post)
class UserTests {

如果需要,模拟注解支持类列表,例如:@Mock([Domain1, Domain2, Domain3])

于 2013-07-29T11:36:03.910 回答