当前位置: 首页 > 知识库问答 >
问题:

Grails3单元测试中GORM addTo方法的使用

廖华翰
2023-03-14

我正在将Grails2中的一系列单元测试升级到Grails3,并且在使用GORM动态方法的域测试中遇到了问题--特别是addTo{myHasMany}方法。

给定以下域对象

class Contact {
  static hasMany = [ emails: ContactEmail ]

  void addEmail(ContactEmail newEmail) {

    //Clear the existing primary flag if the new email is marked primary
    if (newEmail.primaryEmail == true) {
        for (ContactEmail contactEmail in this.emails) {
            if (contactEmail.primaryEmail == true) {
                contactEmail.primaryEmail = false
            }
        }
    }

    //Implicitly set the primary flag on the new email if it is the first in the list
    if ((this.emails == null) || (this.emails.size() == 0)) {
        newEmail.primaryEmail = true
    }

    //Add the email to the contact
    this.addToEmails(newEmail)
  }

}

class ContactEmail {
  String email
  Boolean primaryEmail

  static belongsTo = [ contact: Contact ]
}
@TestMixin(DomainClassUnitTestMixin)
@TestFor(Contact)
class ContactSpec {

  def setup() {
  }

  def cleanup() {
  }

  @Unroll
  void "test Contact addEmail()"() {
    when:
    Contact contact = new Contact()
    ContactEmail contactEmail = new ContactEmail(email: "test@spiekerpoint.com", primaryEmail: false)
    contact.addEmail(contactEmail)

    then:       
    /* DOC - The add email without any other emails should implicitly set the primary email */
    contact.primaryEmail.toString() == "test@spiekerpoint.com"
  }
}

>

  • 我尝试使用DomainClassUnitTestMixin和mockDomain()方法模拟Contact实例,以生成带有GORM方法(或子集)的实例。

    我已经尝试了使用基于Spock交互的测试支持的方法。

    事实上,我已经尝试了几乎所有我能想到的组合来让这个工作没有任何运气。我重读了最新Grails规范中的测试部分。

    在这里有什么方法可以让它保持一个单元测试吗?

  • 共有1个答案

    申屠无尘
    2023-03-14

    我没有看到newemail在方法中的任何位置被初始化。因此,addtoEmails()失败,因为传递的参数为null。我认为您希望您的方法声明如下。

    void addEmail(ContactEmail newEmail) {
    //Clear the existing primary flag if the new email is marked primary
    if (newEmail.primaryEmail == true) {
        for (ContactEmail contactEmail in this.emails) {
            if (contactEmail.primaryEmail == true) {
                contactEmail.primaryEmail = false
            }
        }
    }
    
    //Implicitly set the primary flag on the new email if it is the first in the list
    if ((this.emails == null) || (this.emails.size() == 0)) {
        newEmail.primaryEmail = true
    }
    
    //Add the email to the contact
    this.addToEmails(newEmail)
     }
    
     类似资料:
    • 我正在将Grails2中的一系列单元测试升级到Grails3,并在使用Spock数据驱动测试格式驱动测试的域测试中遇到问题。 当我执行测试时,因为测试执行没有填充测试中的错误、字段和val引用。如前所述,这个测试适用于Grails2.5.5,所以我怀疑我缺少了Grails3中需要的一些东西。 Edited:我删除了原来在setup()中的mockForConstraints()调用,使其无效。

    • 问题内容: 我有以前具有大量方法的类,因此我将此方法的工作细分为“辅助”方法。 这些辅助方法声明为强制执行封装- 但是我想对大型公共方法进行单元测试。是否也可以对辅助方法进行单元测试,好象其中的一个失败,而调用它的公共方法也会失败,这样我们就可以确定为什么失败了? 另外,为了使用模拟对象测试这些对象,我需要将其可见性从私有更改为受保护,这是否可取? 问题答案: 一种方法是省略测试并将其放在同一程序

    • 测试失败,因为为。为什么不以阻塞的方式在ViewModel中运行块? 我知道,如果将其转换为返回对象的方法,则可以通过调用获取对象,或者可以返回并调用。但是,我想通过将我的ViewModel方法保留为函数来实现这一点,有没有办法做到这一点呢?

    • 我在单元测试中使用了Moq框架。这是UpdateApplication测试方法: 我在运行测试时遇到一个异常: 我应该如何编写使用Moq更新和删除操作的单元测试?

    • 有人可以告诉我我应该如何测试这两种方法吗: 问题是,我正在使用当前登录的用户进行基本身份验证,但不知道如何进行,也不知道我是否可以模仿这些主体。有办法做到这一点吗?那些方法在我的服务层中,所以也许我不能做单元测试,我只能做集成测试,因为那些方法大量使用DB? 编辑1:我更改的测试类: 我现在得到这些错误: 米辛 编辑2:这是我的UserServiceBean类: } 这是我的用户存储库: 编辑6:

    • 测试方法: 测试用例: