RestTemplate的单元测试模拟

时间:2017-04-05 22:36:20

标签: unit-testing junit mockito invocationtargetexception

我有一个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。看起来它没有模拟休息模板,并且它正在打破,因为休息模板为空。任何帮助都会表示赞赏。谢谢

1 个答案:

答案 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

我通常更喜欢构造函数注入。