Вызов метода цепочки для Mockito Mock возвращает NULL - PullRequest
0 голосов
/ 09 июля 2019

У меня есть следующий @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();
  }
}

Когдатест выполняет LINE (2) и вызывает перехватчик, в LINE (1) я получаю исключение нулевого указателя.

Я предполагал, что, включив глубокую заглушку на макете, я смогусделать цепной вызов и получить ожидаемое значение, например, producer.getProducer().getSomeVal(), но, похоже, это не так.

Знаете ли вы, как я могу заставить это работать так, как ожидалось?

PS Я пробовал разные варианты добавления MockitoAnnotation.initMocks() и избавления от @Rule, или просто @Autowired MyInterceptor в тестовом классе, что в этом случае MyProducer вообще не подвергается насмешкам, но, похоже, ничего не происходитработа.

Обратите внимание, что MyProducer нельзя изменить, как это сделано в другом проекте.

1 Ответ

0 голосов
/ 09 июля 2019

Вы смоделировали класс MyProducer, но вы не предоставили when для producer.getProducer().

Итак, когда код вызывает producer.getProducer(), он вернет значение макета по умолчанию, что является нулем.

Вы можете попробовать несколько разных подходов:

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

Я не уверен, сработает ли это - может.

В противном случае,вы можете написать локальный тестовый класс, который реализует / расширяет то, что возвращает getProducer (), который, в свою очередь, возвращает соответствующее тестовое значение, когда правильные параметры передаются в getSomeVal().

...