Spring Boot在测试时嘲笑其他休息客户端

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot在测试时嘲笑其他休息客户端相关的知识,希望对你有一定的参考价值。

我正在使用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并将其注入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)));
  }
}

以上是关于Spring Boot在测试时嘲笑其他休息客户端的主要内容,如果未能解决你的问题,请参考以下文章

kotlin + Spring boot 中的单元测试休息控制器

使用 spring boot、kotlin 和 junit 进行休息控制器单元测试

使用 Spring Boot 执行器安全地关闭休息服务器?

Spring Boot 2 - 自动装配服务时对 Feign 客户端的不满意依赖

在laravel 5.1单元测试中嘲笑hasMany关系

独立休息服务的Spring Boot安全性[重复]