Spring Boot издевается над остальными клиентами при тестировании - PullRequest
0 голосов
/ 07 июня 2018

Я использую удаленный API в моем проекте Spring MVC, используя RestTemplate.Один клиент для аутентификации называется 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.Но мой тест не проходит с ошибкой, которая говорит «Ошибка создания bean-компонента с именем« qrKeyApiClient »: неудовлетворенная зависимость выражается через поле« loginApiClient »;»

Так как я могу протестировать этот клиент сиздеваться над другими клиентами, которые являются его членами.

1 Ответ

0 голосов
/ 07 июня 2018

Кажется, проблема в смешанном использовании аннотаций 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)));
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...