【发布时间】: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