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会更好