Spring Boot 在测试时模拟其他休息客户端



我正在使用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。可能不需要requestEntityresponseEntity

@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)));
}
}

相关内容

最新更新