У меня есть следующий @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
нельзя изменить, как это сделано в другом проекте.