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

标签 java spring unit-testing 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 并将其注入(inject)到 QrKeyApiClient。但我的测试没有通过,并出现错误:“创建名称为“qrKeyApiClient”的 bean 时出错:通过字段“loginApiClient”表达的依赖关系不满足;”

那么我如何通过模拟该客户端的其他客户端来测试该客户端。

最佳答案

问题似乎是 Spring 和 Mockito 注释的混合使用。 Spring 为应用程序上下文中的模拟服务提供了 @MockBean 注解。

尝试用 @MockBean 替换 @Mock,用 @Autowired 替换 @InjectMocks。那么可能就不需要 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)));
  }
}

关于java - Spring Boot 在测试时模拟其他休息客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50735755/

相关文章:

java - 如何在解析 Google-trends html 响应时删除状态 203 错误?

java - 如何使用 Avro 在 Spring Kafka 1.3 中移动过去不可反序列化的消息

java - Controller 应使用 Spring MVC 中的模型在每次返回时附加某些参数

java - Spring/JPA 中的实体更新选项

Python:使用用于单元测试的文件创建模拟或假目录

java - junit 测试套件

java - Ant javac 任务出错 : [javac] warning: [options] bootstrap class path not set in conjunction with -source 1. 6

java - 如果 docx 已有一些,如何添加新的 CustomXmlDataStoragePropertiesPart?

java - 如何在Java中读取仅包含1行或1个单词的文件

java - 如何使 Mockito.verify 忽略其他类型参数?