RestTemplate 的单元测试模拟

Unit test mock for RestTemplate

我有一个带有 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。看起来它无法模拟 rest 模板,并且由于 rest 模板为 null 而中断。任何帮助都会 appreciated.Thanks

模拟剩余模板并没有失败,但它没有将模拟的剩余模板注入到您的产品中 class。至少有两种方法可以解决这个问题。

您可以更改生产代码和 use constructor injection。将 RestTemplate 作为参数移动到构造函数,然后您可以在测试中传递模拟:

@Service
public class MyService {
    @Autowired
    public MyService(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }
}

在您的测试中,您将像创建任何其他对象一样简单地创建服务并将其传递给您的模拟 rest 模板。

或者您可以更改您的测试以使用以下注释注入您的服务:

@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

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