我正在使用RestTemplate在我的Spring MVC项目中使用远程api。一个客户端用于名为LoginApiClient
的身份验证,我必须在所有其他 rest 客户端中使用它。
这是我的休息客户端,它使用LoginApiClient
并使用 QrCode API。
@Service
public class QrKeyApiClient implements QrKeyApiClientBase {
private RestTemplate restTemplate;
@Autowired
private LoginApiClientBase loginApiClient;
public QrKeyApiClient(RestTemplateBuilder builder) {
restTemplate = builder.build();
restTemplate.setErrorHandler(new ErrorHandler());
}
//Other implementation details
}
这是LoginApiClient
@Service
public class LoginApiClient implements LoginApiClientBase {
private RestTemplate restTemplate;
public LoginApiClient(RestTemplateBuilder builder) {
restTemplate = builder.build();
restTemplate.setErrorHandler(new ErrorHandler());
}
//Other implementation details
}
我的QrKeyApiClient
单元测试类如下所示。
@RunWith(SpringRunner.class)
@RestClientTest({QrKeyApiClient.class})
@Category(IUnitTest.class)
public class QrKeyApiClientTest {
@Value("${getQrCodeUrl}")
private String getQrCodeUrl;
@Mock
LoginApiClient loginApiClient;
@Autowired
private MockRestServiceServer server;
@InjectMocks
private QrKeyApiClient client;
@Test
public void getQrCodeAsImage_makesTrueCallToApi() throws Exception {
ResponseEntity<String> responseEntity = mock(ResponseEntity.class);
HttpEntity requestEntity = new HttpEntity<>(qrCodeGenerateRequest,new HttpHeaders());
this.server
.expect(requestTo(this.getQrCodeUrl))
.andExpect(method(HttpMethod.POST))
.andRespond(withSuccess("successResult", MediaType.TEXT_PLAIN));
String qrImage = this.client.getQrCodeAsImage(qrCodeGenerateRequest);
server.verify();
assertThat(qrImage, is(notNullValue(String.class)));
}
}
我不确定这是正确的方法,但我想在这个测试中嘲笑我的LoginApiClient
并将其注入QrKeyApiClient
。但是我的测试没有通过,并显示一个错误,显示"创建名为'qrKeyApiClient'的bean时出错:通过字段'loginApiClient'表示的不满意的依赖关系;">
那么我如何通过模拟其他客户端来测试这个客户端。
似乎问题在于Spring和Mockito注释的混合使用。Spring 提供了@MockBean
注释来模拟应用程序上下文中的服务。
尝试将@Mock
替换为@MockBean
,@InjectMocks
替换为@Autowired
。可能不需要requestEntity
和responseEntity
。
@RunWith(SpringRunner.class)
@RestClientTest({QrKeyApiClient.class})
@Category(IUnitTest.class)
public class QrKeyApiClientTest {
@Value("${getQrCodeUrl}")
private String getQrCodeUrl;
@MockBean
LoginApiClient loginApiClient;
@Autowired
private MockRestServiceServer server;
@Autowired
private QrKeyApiClient client;
@Test
public void getQrCodeAsImage_makesTrueCallToApi() throws Exception {
this.server
.expect(requestTo(this.getQrCodeUrl))
.andExpect(method(HttpMethod.POST))
.andRespond(withSuccess("successResult", MediaType.TEXT_PLAIN));
String qrImage = this.client.getQrCodeAsImage(qrCodeGenerateRequest);
server.verify();
assertThat(qrImage, is(notNullValue(String.class)));
}
}