Java 模拟可选参数时出现空指针异常
我的代码的格式如下:Java 模拟可选参数时出现空指针异常,java,testing,junit,java-8,mockito,Java,Testing,Junit,Java 8,Mockito,我的代码的格式如下: public String getDeliveryDestinations(final RequestContext requestContext { final Accessor accessor = requestContext.getAccessor().get(); final GroupAccessor groupAccessor = accessor.getGroupAccessor(); final String groupId =
public String getDeliveryDestinations(final RequestContext requestContext {
final Accessor accessor = requestContext.getAccessor().get();
final GroupAccessor groupAccessor = accessor.getGroupAccessor();
final String groupId = groupAccessor.getGroupId();
if(groupId.equals("s1") return "Type1";
else return "type 2";
}
为了测试这一点,我写了以下内容:
@Test
public void getDestinationsDestinations_empty() throws Exception {
Accessor accessor = mock(Accessor.class);
GroupAccessor groupAccessor = mock(GroupAccessor.class);
//*mockRequestContent is Mocked*
when(mockRequestContext.getAccessor().get()).thenReturn(accessor);
when(accessor.getGroupAccessor()).thenReturn(groupAccessor);
when(groupAccessor.getGroupId()).thenReturn("s1");
String destinationResult = provider.getDeliveryDestinations(mockRequestContext);
assertEquals(destinationResult,"Type1");
}
我在,
当(mockRequestContext.getAccessor().get())。然后返回(accessor);
我不知道为什么
任何潜在客户都会非常有用:)当getAccessor()
需要返回可选信息时,您可以这样做:
Accessor accessor = mock(Accessor.class);
GroupAccessor groupAccessor = mock(GroupAccessor.class);
Optional<Accessor> optAccessor = Optional.of(accesor)
when(mockRequestContext.getAccessor()).thenReturn(optAccessor)
when(accessor.getGroupAccessor()).thenReturn(groupAccessor);
when(groupAccessor.getGroupId()).thenReturn("s1");
Accessor-Accessor=mock(Accessor.class);
GroupAccessor-GroupAccessor=mock(GroupAccessor.class);
Optional optAccessor=Optional.of(accesor)
当(mockRequestContext.getAccessor())。然后返回(optAccessor)
当(accessor.getGroupAccessor())。然后返回(groupAccessor);
当(groupAccessor.getGroupId())。然后返回(“s1”);
好吧,您从未告诉mockRequestContext getAccessor()返回什么。所以它返回null。并且不能对null调用get()。或者它返回一个空的可选值(假设这是返回类型)。试图获取空可选项的值会抛出一个NPE。@JBNizet应该写什么?when(mockRequestContext.getAccessor()).thenReturn(可选的.of(accessor));当(mockRequestContext.getAccessor().get())。然后返回(accessor);这是正确的吗?事实上,我对这个还不太熟悉。只需when(mockRequestContext.getAccessor())。然后返回(可选的.of(accessor))代码>当调用真正的可选函数的get()方法时,您不能告诉它返回什么。你只能通过模仿来做到这一点。并且可选的.of()不返回模拟。你为什么不自己测试一下呢?技术上你是对的。但我们不应该帮助某人测试火车残骸。SUT的设计很差,它应该被修复,而不是在这个糟糕的设计中挣扎的测试!但是您不知道GroupAccessor
的代码是否可以更改。而且不能帮助测试,因为要测试的东西的设计很差——好吧,这不是我的看法。但是你至少可以提出真正的解决方案,即使你计划展示如何做事情——而且IMHO会更好