Mockito –使用全局配置的SmartNull在NPE上提供更好的错误消息

编写Mockito参考卡后,我有机会仔细研究了Mockito不太流行但非常有用的功能。 其中一些过于先进或太稀少,无法在refcard中进行描述,因此应简短说明。 其中之一就是SmartNull。 当前,非空方法返回适用于已知类型(例如:0,false,空集合)的“安全空值”,或者在其他情况下返回null。 可以返回SmartNull to而不是纯null来在NPE上接收更多描述性错误消息。

发生NullPointerException时,不仅是一行:

java.lang.NullPointerException
    at PlantWaterer.generateNPE(PlantWaterer.java:24)
    at DefaultValuesTest.shouldReturnNicerErrorMessageOnNPE(DefaultValuesTest.java:64)

我们还获得了描述性信息,说明未使用哪种方法:

org.mockito.exceptions.verification.SmartNullPointerException:
You have a NullPointerException here:
?> at PlantWaterer.generateNPE(PlantWaterer.java: 24)
because this method call was ?not? stubbed correctly:
?> at PlantWaterer.generateNPE(PlantWaterer.java: 24)
wateringScheduler.returnNull();

    at PlantWaterer.generateNPE(PlantWaterer.java: 24)
    at DefaultValuesTest.shouldReturnNicerErrorMessageOnNPE(DefaultValuesTest.java:64)

可以指示特定的模拟返回SmartNull而不是null值:

PlantWaterer plantWatererMock =
        mock(PlantWaterer.class, Mockito.RETURNS_SMART_NULLS);

要么

@Mock(answer = Answers.RETURNS_SMART_NULLS)
private PlantWaterer plantWatererMock;

SmartNull可能是Mockito 2.0中的默认行为,但是为了实现1.9.x中的向后兼容性,必须明确告知每个模拟都使用它。 需要编写另一段样板代码导致几乎没有人使用SmartNull,尽管它是一个非常有用的功能。 Mockito的第二个几乎未知的元素进入了游戏-全局配置。 通常,不需要配置Mockito。 它只是工作。 但是在极少数情况下,框架的作者留下了一个门,该门允许覆盖一些核心行为的默认配置,包括未打桩方法的默认答案策略。

为了使其正常工作,有必要创建实现IMockitoConfiguration接口的org.mockito.configuration.MockitoConfiguration类( 必须在该包中 )。 通常,扩展DefaultMockitoConfiguration类并且仅覆盖所需的行为是很舒服的。

package org.mockito.configuration;

import org.mockito.internal.stubbing.defaultanswers.ReturnsSmartNulls;
import org.mockito.stubbing.Answer;

public class MockitoConfiguration extends DefaultMockitoConfiguration {

    public Answer<Object> getDefaultAnswer() {
        return new ReturnsSmartNulls();
    }
}

准备之后,对于模块中的每个模拟,我们都应该获取带详细输出的SmartNullPointerException而不是纯NullPointerException。

@Test(expectedExceptions = SmartNullPointerException.class)
public void shouldReturnNicerErrorMessageOnNPE() {
    //given
    //Mockito.RETURNS_SMART_NULLS not needed anymore
    WateringScheduler wateringSchedulerMock = mock(WateringScheduler.class);
    WaterSource waterSourceMock = mock(WaterSource.class);
    PlantWaterer plantWatererMock =
            new PlantWaterer(waterSourceMock, wateringSchedulerMock);

    //when
    plantWatererMock.generateNPE();

    //then
    //SmartNullPointerException exception expected
}

这篇文章是“ 超越Mockito refcard ”系列文章的第一部分。

参考: 除了Mockito refcard之外-第1部分–来自Solid Soft博客的JCG合作伙伴 Marcin Zajaczkowski 使用全局配置的SmartNull在NPE上提供了更好的错误消息


翻译自: https://www.javacodegeeks.com/2012/07/mockito-better-error-messages-on-npe.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值