Várias pessoas tiveram problemas semelhantes, mas o que foi marcado como solução para elas não resolveu o problema para mim.
Pom.xml:
:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<scope>test</scope>
</dependency>
:
ClienteControllerTest2.java
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.reactive.server.WebTestClient;
import static org.springframework.http.HttpHeaders.ACCEPT;
import static org.springframework.http.MediaType.APPLICATION_JSON;
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureWebTestClient
public class CustomerControllerTest2 {
@Autowired
private WebTestClient webTestClient;
@Test
void shouldReturnManyCustomers(){
this.webTestClient
.get()
.uri("/customers")
.header(ACCEPT,APPLICATION_JSON_VALUE)
.exchange()
.expectStatus()
.is2xxSuccessful()
.expectHeader()
.contentType(APPLICATION_JSON)
.expectBody()
.jsonPath("$.length()").isNumber()
.jsonPath("$[0].id").isEqualTo(1);
}
}
Segundo outros, a solução é adicionar "@AutoConfigureWebTestClient" e "@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)"
Mas isso não ajudou.
Quando uso TestRestTemplate não tenho problemas, por exemplo, o seguinte funciona imediatamente:
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.test.web.server.LocalServerPort;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class CustomerControllerTest {
@LocalServerPort
private int port;
@Autowired
private TestRestTemplate restTemplate;
@Test
void greetingShouldReturnDefaultMessage() throws Exception {
assertThat(this.restTemplate.getForObject("http://localhost:" + port + "/customers",
String.class)).contains("[email protected]");
}
}
Estes documentos:
diga que o seguinte funcionará:
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class MyRandomPortWebTestClientTests {
@Test
void exampleTest(@Autowired WebTestClient webClient) {
webClient
.get().uri("/")
.exchange()
.expectStatus().isOk()
.expectBody(String.class).isEqualTo("Hello World");
}
}
Mas isso também fornece o mesmo "Nenhum bean qualificado do tipo 'org.springframework.test.web.reactive.server.WebTestClient' disponível: esperado pelo menos 1 bean que se qualifique como candidato a autowire."
Curiosamente, se eu executar o "mvn test", os testes TestRestTemplate e TesWebClient funcionarão. Se eu executar os testes usando o intellij, ele falhará. No intellij, parece não saber como executar nada por padrão, mas há uma configuração de execução "All in package" no junit, que é a única maneira que vejo para executar os testes, e isso executa todos os testes TestRestTemplate sem problemas, mas todos os testes baseados no WebTestClient falham sem o problema de bean qualificado.
@AutoConfigureWebTestClient
destina-se ao uso com um ambiente web simulado. Do seu javadoc:Você está contradizendo isso usando
@AutoConfigureWebTestClient
ewebEnvironment = WebEnvironment.RANDOM_PORT
em combinação. Em vez disso, você poderia usar@SpringBootTest
seu ambiente web simulado padrão:Você pode aprender mais sobre isso na documentação de referência .