发生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