将方法调用链接到 Mockito Mock Returns Null

Chaining Method Calls to a Mockito Mock Returns Null

我有一个下面的 @Component 带有一个注入的对象,该对象进行链式方法调用以获取某些东西,例如

@Component
public class MyInterceptor implements ClientHttpRequestInterceptor {

  @Autowired
  public MyProducer producer;

  @Override
  public ClientHttpResponse intercept(…) throws IOException {
    String val = producer.getProducer().getSomeVal(/*parameters*/); // LINE (1)
  }

}

我的测试class是:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { MyInterceptor.class, MyProducer.class } )

public class MyInterceptorTest {

  private RestTemplate restTemplate = new RestTemplate();
  private MockRestSErviceServer mockServer;

  @Rule
  public MockitoRule rule = MockitoJUnit.rule();

  @Mock
  public MyProducer producer;

  @InjectMocks
  private MyInterceptor interceptor;

  @Before
  public void init() {
    //MockitoAnnotation.initMocks(this);
    producer = Mockito.mock(MyProducer.class, Mockito.RETURNS_DEEP_STUBS);
    // adding interceptor to RestTemplate
    mockServer = MockRestServiceServer.createServer(restTemplate);

    when(producer.getProducer().getSomeVal(null, null)).thenReturn("SomeValue");

  }

  @Test
  public void myTestMethod() {
    mockServer.expect(requestTo(/*some dummy URL*/)
      .andExpect(method(HttpMethod.GET))
      .andExcept(/*some header stuff omitted from MyInterceptor */)
      .andRespond(withSuccess(/*…*/));

    // This is going to trigger the Interceptor being invoked
    restTemplate.getForEntity("some dummy URL", String.class); // LINE (2)

    mockServer.verify();
  }
}

当测试执行 LINE (2) 并调用拦截器时,在 LINE (1) 中我得到一个空指针异常。

我假设通过在模拟上启用深度存根,我将能够进行链式调用并获得预期值,例如producer.getProducer().getSomeVal(),但好像不是这样

你知道我怎样才能让它按预期工作吗?

P.S。我尝试了添加 MockitoAnnotation.initMocks() 和删除 @Rule 的不同变体,或者在测试 class 中仅添加 @Autowired MyInterceptor,这会导致 MyProducer 一点都不被嘲笑,但似乎没有任何效果。

请注意,MyProducer 无法修改,因为它来自另一个项目。

您嘲笑了 MyProducer class,但您没有为 producer.getProducer() 提供 when

因此,当代码调用 producer.getProducer() 时,它将 return 默认模拟值,即 null。

您可以尝试几种不同的方法:

when(producer.getProducer()).thenReturn(producer);

我不确定这是否行得通 - 可能行得通。

否则,您可以编写一个本地测试 class implements/extends 无论 getProducer() returns,这反过来 returns 适当的测试将正确的参数传递给 getSomeVal().

时的值