链接方法调用摩知道模拟返回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)
  }
}

我的测试课是:

@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();
  }
}

测试执行行(2(并调用拦截器时,在第(1(行中,我会得到一个无效的指针异常。

我的假设是,通过对模拟进行深刻的固执,我将能够进行连锁调用并获得预期价值,例如producer.getProducer().getSomeVal(),但似乎并非如此。

您知道我如何按预期工作?

P.S。我尝试了添加MockitoAnnotation.initMocks()并摆脱@Rule的不同变体,或者只是在测试类中仅@Autowired MyInterceptor,这在此导致MyProducer根本不被模拟,但似乎没有任何措施。

>

注意,MyProducer不能像从另一个项目中修改。

您已经模拟了MyProducer类,但是您尚未为producer.getProducer()提供CC_11。

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

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

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

我不确定这是否会起作用 -

否则,您可以编写一个本地测试类,该类别实现/扩展了任何GetProducer((返回的内容,当将正确的参数传递给getSomeVal()时,该类又返回适当的测试值。

相关内容

  • 没有找到相关文章

最新更新