[英]WebTestclient is throwing Null Exception tough @Autowire is there
该项目是 spring 启动应用程序。 当尝试从测试用例中作为 webtestclient 访问 api 时,它会抛出空点异常。
class 和 Restcontroller an 和 testclass 如下
这是 class
@Component
public class GetMessage {
@Async
public void fetchData( fileType Type, String requestBody) {
switch (A) {
case a:
operation(requestBody);
break;
case b:
// do some Operation
break;
default:
break;
}
}
}
Rest controller
@RestController()
@RequestMapping("api/school/student-receiver/assignment")
public class FileReceiverRestController {
@Autowired
private objectMapper mapper;
@PostMapping(path = "/file", consumes = "application/json")
public ResponseEntity<String> receivefile(@RequestBody String reqBody) {
mapper.fetchData(fileType.A ,String reqBody);
return new ResponseEntity<>(CALL_RESP, HttpStatus.OK);
}
测试 class
@AutoConfigureWebTestClient
public class E2ETest {
@Autowired
private WebTestClient webTestClient ;
String ReceiverUrl="api/school/student-receiver/assignment/file"
@Test
pubilic void Testapi()
{
webTestClient //====> facing null exception
.post().uri(ReceiverUrl)
//.header("Content-Type", "application/json")
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(requestPayload)
.accept(MediaType.APPLICATION_JSON)
.exchange()
// then
.expectStatus().isEqualTo(HttpStatus.OK);
}
}
java.lang.NullPointerException at E2ETest.Testapi(E2ETest.java:176) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl .java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org. junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallabl e.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit .runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org. junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Z93F725A07423FE1C889 F448B33D21F46Z:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate (ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner. startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33) at Z4D236D9A2D102C5FE6AD1C50D A4BEC50Z.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
根据我对Spring引导项目的理解,使用@AutoconfigureWebTestClient
仅在测试 WebFlux 应用程序时才有效。 当您使用 Spring MVC (Tomcat) 并且只想使用WebClient
/ WebTestClient
时,这可能是原因。
@AutoconfigureWebTestClient
的 Javadoc 也对此添加了提示:
/**
* Annotation that can be applied to a test class to enable a {@link WebTestClient}. At
* the moment, only WebFlux applications are supported.
*
* @author Stephane Nicoll
* @since 2.0.0
* @see WebTestClientAutoConfiguration
*/
尽管如此,有效的是使用@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
进行测试。 这将确保在后台自动配置TestRestTemplate
和WebTestClient
:
// if you are using JUnit 4 this is also needed
// @RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class WebTestClientAccessTest {
@Autowired
private WebTestClient webTestClient;
@Autowired
private TestRestTemplate testRestTemplate;
@Test
public void notNull() {
assertNotNull(webTestClient);
assertNotNull(testRestTemplate);
}
}
这将启动整个 Spring 上下文,您可以使用客户端从外部访问您的应用程序。
如果您不想启动嵌入式 Tomcat 并加载所有 bean,您可以查看@WebMvcTest
以专注于测试您的 web 层。 为此,您将使用MockMvc
并使用模拟的 servlet 环境。 Spring Boot 的此入门指南提供了很好的介绍。
更多信息可以在Spring 引导文档中找到。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.