我有一个restTemplate的服务方法。作为单元测试的一部分,我试图模仿它,但有些失败。
服务方式:
@Autowired
private RestTemplate getRestTemplate;
return getRestTemplate.getForObject(restDiagnosisGetUrl, SfdcCustomerResponseType.class);
测试方法:
private CaresToSfdcResponseConverter caresToSfdcResponseConverter;
@Before
public void setUp() throws Exception {
caresToSfdcResponseConverter = new CaresToSfdcResponseConverter();
}
@Test
public void testConvert(){
RestTemplate mock = Mockito.mock(RestTemplate.class);
Mockito.when(mock.getForObject(Matchers.anyString(), Matchers.eq(SfdcCustomerResponseType.class))).thenReturn(sfdcCustomerResponseType);
}
sfdcRequest = caresToSfdcResponseConverter.convert(responseForSfdcAndHybris);
它给出了NullPointerException。看起来它没有模拟休息模板,并且它正在打破,因为休息模板为空。任何帮助都会表示赞赏。谢谢
答案 0 :(得分:1)
它没有嘲笑其余的模板,但它没有将模拟的休息模板注入你的生产类。至少有两种方法可以解决这个问题。
您可以更改生产代码和use constructor injection。将RestTemplate作为参数移动到构造函数,然后您可以在测试中传递模拟:
@Service
public class MyService {
@Autowired
public MyService(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
}
在测试中,您只需将服务创建为任何其他对象,并将其传递给模拟的休息模板。
或者您可以使用以下注释更改测试以注入服务:
@RunWith(MockitoJUnitRunner.class)
public class MyServiceTest {
@InjectMocks
private MyService myService;
@Mock
private RestTemplate restTemplate;
@Test
public void testConvert(){
Mockito.when(mock.getForObject(Matchers.anyString(), Matchers.eq(SfdcCustomerResponseType.class))).thenReturn(sfdcCustomerResponseType);
}
}
您可以在另一个SO问题中看到一个示例:Using @Mock and @InjectMocks
我通常更喜欢构造函数注入。