有几个人遇到了类似的问题,但标记为他们的解决方案并没有解决我的问题。
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>
:
CustomerControllerTest2.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);
}
}
根据其他人的说法,解决方案是添加“@AutoConfigureWebTestClient”和“@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)”
但这并没有帮助。
当我使用 TestRestTemplate 时,我没有任何问题,例如下面的代码可以开箱即用:
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]");
}
}
这些文档:
说以下内容会起作用:
@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");
}
}
但这也给出了相同的“没有可用的'org.springframework.test.web.reactive.server.WebTestClient'类型的合格bean:预计至少有1个符合自动装配候选资格的bean。”
有趣的是,如果我运行“mvn test”,TestRestTemplate 和 TesWebClient 测试都可以工作。如果我使用 intellij 运行测试,它会失败。在intellij中,默认情况下它似乎不知道如何运行任何东西,但是junit下有一个“All in package”运行配置,这是我可以看到运行测试的唯一方法,并且这运行所有TestRestTemplate测试没有问题,但所有 WebTestClient 基础测试都会因无合格 bean 问题而失败。
@AutoConfigureWebTestClient
旨在与模拟 Web 环境一起使用。来自它的javadoc:您通过组合使用
@AutoConfigureWebTestClient
和来矛盾这一点。webEnvironment = WebEnvironment.RANDOM_PORT
相反,您可以使用@SpringBootTest
其默认的模拟 Web 环境:您可以在参考文档中了解更多相关信息。