我正在使用 RestTemplate 在 Spring MVC 项目中使用远程 api。一个客户端用于名为 LoginApiClient
的身份验证,我必须在所有其他其余客户端中使用它。
这是我的其余客户端,它使用 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
并将其注入(inject)到 QrKeyApiClient
。但我的测试没有通过,并出现错误:“创建名称为“qrKeyApiClient”的 bean 时出错:通过字段“loginApiClient”表达的依赖关系不满足;”
那么我如何通过模拟该客户端的其他客户端来测试该客户端。
最佳答案
问题似乎是 Spring 和 Mockito 注释的混合使用。 Spring 为应用程序上下文中的模拟服务提供了 @MockBean
注解。
尝试用 @MockBean
替换 @Mock
,用 @Autowired
替换 @InjectMocks
。那么可能就不需要 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)));
}
}
关于java - Spring Boot 在测试时模拟其他休息客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50735755/