【问题标题】:Testing NullOject in Grails Application在 Grails 应用程序中测试 NullOject
【发布时间】:2013-11-19 16:12:14
【问题描述】:

使用 grails 2.2.1 并遇到使用 NullObject 而不是 null 的服务方法的问题。

单元测试失败,出现以下异常;

|  java.lang.NullPointerException: Cannot get property 'class' on null object
at grails.test.GrailsMock$_createMock_closure1_closure2.doCall(GrailsMock.groovy:105)
at grails.test.GrailsMock$_createMock_closure1.doCall(GrailsMock.groovy:103)

cacheService单元测试如下;

@Test
public void shouldCacheForCacheTypeJbossNullableObject() {

grailsApplication.config.domain.cache = "jbosscache"

cacheService.jbossCacheService = jbossMock.createMock()

cacheService.cacheWithNullable( at, ct, key, null ) 
jbossMock.verify()
}

cacheService 是这样的;

@Override
void cacheWithNullable(Token token, String type, String key, Object value)
{
    if(!value)
    {
       jbossCacheService.cache(token, type, key, new NullObject())
    }
}

请注意:为清楚起见,部分逻辑已被删除。

jbossCacheService 测试用例具有 100% 的测试覆盖率并按预期运行以确保不会将空值应用于缓存。但是,由于 NPE 的 cacheService 测试失败,我无法获得此方法测试,因此我可以模拟返回服务或应用需求。

感谢任何帮助。

【问题讨论】:

  • 为什么直接调用NullObject?
  • 因为缓存无法处理/操作 null 但它可以处理 NullObject。 jbossCacheService 类按预期工作,但调用 jbossCacheService 的 cacheService 是 JUnit 中的问题。针对竹子版本进行测试,逻辑在部署时都可以正常工作。
  • 一些关于 NullObject jworks.nl/2011/08/19/friday-repost-groovy-and-null的好读物

标签: unit-testing grails groovy junit null


【解决方案1】:

看起来 NullObject 是一个无类的类!因此,在 GrailsMock.class 中,以下代码行在第 105 行失败将失败

   if (it != null) {
                    if (it.class instanceof Class) {

这意味着 NullOject 将通过 null 检查但在 instanceof 上失败。所以单元测试永远不会通过这个逻辑。可能会用 Grails 打开一个 JIRA 以获得更好的解释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-30
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多