spring - Spring WebTestClient bindToController 用法
问题描述
我想弄清楚如何使用 WebTestClient.bindToController()。
我有以下2个课程:
- 控制器
- 服务
Controller.methodx() 调用 Service.methody()。Service.methody() 调用外部 REST POST 端点。
我将如何使用 WebTestClient.bindToController() 来测试这个控制器?我在网上找不到很多使用信息。
控制器:
@RestController
@RequestMapping(produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public class CustomerController {
@Autowired
private CustomerService customerService;
@PostMapping(value="/customer", consumes= MediaType.APPLICATION_JSON_UTF8_VALUE)
public Mono<Customer> saveCustomer(@RequestBody Customer customer){
return this.customerService.saveCustomer(customer);
}
服务:
@Service
public class CustomerService implements ICustomerService {
@Autowired
private WebClient webClient;
@Override
public Mono<Customer> storeMessage(Customer cust) {
Mono<Customer> resp = this.webClient.post()
.uri("/postdata")
.body(BodyInserters.fromObject(customer))
.exchange();
return resp
}
}
配置:
@Configuration
public class ProdConfig {
@Bean
public ICustomerService getCustomerService() {
return new CustomerService();
}
@Bean
public WebClient getWebClient() {
return WebClient.builder()
.baseUrl("baseurl")
.defaultHeader(HttpHeaders.CONTENT_TYPE, MIME_TYPE)
.defaultHeader(HttpHeaders.USER_AGENT, USER_AGENT)
.build();
}
}
测试类:
@ActiveProfiles("test")
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@ContextConfiguration(classes = TestConfig.class)
@AutoConfigureMockMvc
public class CustomerControllerTest {
@MockBean
private CustomerService customerservice;
private WebTestClient testClient;
@Test
public void testSaveCustomer() throws Exception {
testClient= WebTestClient.bindToController(new CustomerController(customerService)).build();
testClient.post().uri("/customer").body(BodyInserters.fromObject(customer))
.exchange()
.expectStatus().is2xxSuccessful();
}
}
测试配置:
@Profile("test")
@Configuration
@EnableAutoConfiguration
public class TestConfig {
@Bean
public WebClient getWebClient() {
return WebClient.builder()
.baseUrl("baseurl")
.defaultHeader(HttpHeaders.CONTENT_TYPE, MIME_TYPE)
.defaultHeader(HttpHeaders.USER_AGENT, USER_AGENT)
.build();
}
}
运行测试类时出错:
org.springframework.test.context.TestContextManager[0;39m: Caught exception while invoking 'afterTestMethod' callback on
TestExecutionListener [org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener@61df66b6] for test method
[public void CustomerControllerTest.testSaveCustomer()] and test instance
[CustomerControllerTest@22da200e]
java.lang.NoSuchMethodError: org.mockito.MockingDetails.getMockCreationSettings()Lorg/mockito/mock/MockCreationSettings;
at org.springframework.boot.test.mock.mockito.MockReset.get(MockReset.java:107)
解决方案
WebTestClient 在内部使用 WebClient 来执行请求。我们可以简单地将控制器绑定到 WebTestClient 来处理请求映射,而不是提供基本 url 来发出请求。
客户控制器.java
@RestController
@RequestMapping(produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public class CustomerController {
private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private CustomerService customerService;
public CustomerController( CustomerService customerService) {
this.customerService = customerService;
}
@PostMapping(value="/customer", consumes= MediaType.APPLICATION_JSON_UTF8_VALUE)
public Mono<Customer> saveCustomer(@RequestBody Customer customer){
return this.customerService.saveCustomer(customer);
}
CustomerControllerTest.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class CustomerControllerRestTest {
private WebTestClient testClient;
@MockBean
private CustomerService customerService;
@Before
public void setup() {
//mock service here
}
@Test
public void testSaveCustomer() throws Exception {
Customer customer = new Customer(1L, "test", CustomerGender.MALE);
testClient= WebTestClient.bindToController(new CustomerController(customerService)).build();
testClient.post().uri("/customer").body(BodyInserters.fromObject(customer))
.exchange()
.expectStatus().is2xxSuccessful();
}
}
推荐阅读
- javascript - 如何将键值对添加到对象?
- javascript - 如何在 React 中渲染组件数组(字符串)?
- python - 远程运行 python 脚本,包括模块
- c# - 角色/帐户更改时使 Identity Core 中的用户无效
- javascript - JavaScript。如何比较输入数组
- python-3.x - SVM 文本分类的概率结果不佳
- php - Symonfy2,Doctrine:重复、默认或忽略 DiscriminatorMap?
- python - 在 Python 中使用 ChromeDriver (Selenium) 通过 CSS 选择器查找元素
- .net - 实现接口的麻烦
- c# - Rx.NET:按顺序组合可观察对象