将方法调用链接到 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()
.
时的值
我有一个下面的 @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()
.