發生NullPointerException時,不僅是一行:
java.lang.NullPointerExceptionat 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 anymoreWateringScheduler wateringSchedulerMock = mock(WateringScheduler.class);WaterSource waterSourceMock = mock(WaterSource.class);PlantWaterer plantWatererMock =new PlantWaterer(waterSourceMock, wateringSchedulerMock);//whenplantWatererMock.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