Spring @WebFluxTest 正在加载 @Component
Spring @WebFluxTest is loading @Component s
我正在尝试在 spring 中创建一个 @WebFluxTest 来测试我的控制器。
@WebFluxTest(value = {MyController.class})
public class MyControllerTest {
@MockBean
private MyService service;
@Autowired
private WebTestClient webTestClient;
@Test
void testSomething() {
...
}
但是,当我执行测试时,我得到了很多:org.springframework.beans.factory.NoSuchBeanDefinitionException 对于 @Component 的依赖项。这意味着,Spring 试图找到 @Component 的依赖项,而它应该忽略这些依赖项。
我知道如果我使用 @WebFluxTest,spring 不应该扫描 class 路径中的任何 @Component。
我的 Application class 只注释了 @SpringBootApplication.
我可能在这里遗漏了什么?
解决方案更新:
所以,我知道发生了什么。实际上,我用 @Component 注释的 class 是 WebFilter 的实现,如果我检查为 WebFluxTest (WebFluxTypeExcludeFilter) 配置的过滤器,它会添加 WebFilter 到包含部分。
这就是 Spring 选择它的原因。
您收到的错误可能正是由于注释@WebFluxTest 未加载您的@Component classes。会不会是您的 MyService 正在实例化任何具有 @Component 的对象?也许你的 MyController
举个例子,假设你的MyService是这样的:
@Service
@AllArgsConstructor
public class MyService {
private final MyRepository repository;
private final Env env;
public void insert(...) {
System.out.println(env.getApplicationName() + " random stuff");
...
}
}
并且您的 Env 使用 @Component 注释,如果您尝试使用 Env class 中的任何方法,您将得到相同的错误 (NoSuchBeanDefinitionException),因为它是由于 MyControllerTest 中的@MockBean,为 null。
如果实例化任何 @Component 对象
,MyController 也是如此
如果是这样,那么在您的 MyControllerTest 中,您可以尝试添加 @Import(Env.class) 甚至尝试使用 when( ) 来自带有 .thenReturn()
的 mockito
如果以上方法均无效,能否请您提供有关错误日志和 service/controller classes 的更多信息?
所以,我知道发生了什么。实际上,我用 @Component 注释的 class 是 WebFilter 的一个实现,如果我检查为 WebFluxTest (WebFluxTypeExcludeFilter) 配置的过滤器,它会将 WebFilter 添加到包含部分。这就是 Spring 选择它的原因。
我正在尝试在 spring 中创建一个 @WebFluxTest 来测试我的控制器。
@WebFluxTest(value = {MyController.class})
public class MyControllerTest {
@MockBean
private MyService service;
@Autowired
private WebTestClient webTestClient;
@Test
void testSomething() {
...
}
但是,当我执行测试时,我得到了很多:org.springframework.beans.factory.NoSuchBeanDefinitionException 对于 @Component 的依赖项。这意味着,Spring 试图找到 @Component 的依赖项,而它应该忽略这些依赖项。 我知道如果我使用 @WebFluxTest,spring 不应该扫描 class 路径中的任何 @Component。
我的 Application class 只注释了 @SpringBootApplication.
我可能在这里遗漏了什么?
解决方案更新:
所以,我知道发生了什么。实际上,我用 @Component 注释的 class 是 WebFilter 的实现,如果我检查为 WebFluxTest (WebFluxTypeExcludeFilter) 配置的过滤器,它会添加 WebFilter 到包含部分。 这就是 Spring 选择它的原因。
您收到的错误可能正是由于注释@WebFluxTest 未加载您的@Component classes。会不会是您的 MyService 正在实例化任何具有 @Component 的对象?也许你的 MyController
举个例子,假设你的MyService是这样的:
@Service
@AllArgsConstructor
public class MyService {
private final MyRepository repository;
private final Env env;
public void insert(...) {
System.out.println(env.getApplicationName() + " random stuff");
...
}
}
并且您的 Env 使用 @Component 注释,如果您尝试使用 Env class 中的任何方法,您将得到相同的错误 (NoSuchBeanDefinitionException),因为它是由于 MyControllerTest 中的@MockBean,为 null。 如果实例化任何 @Component 对象
,MyController 也是如此如果是这样,那么在您的 MyControllerTest 中,您可以尝试添加 @Import(Env.class) 甚至尝试使用 when( ) 来自带有 .thenReturn()
的 mockito如果以上方法均无效,能否请您提供有关错误日志和 service/controller classes 的更多信息?
所以,我知道发生了什么。实际上,我用 @Component 注释的 class 是 WebFilter 的一个实现,如果我检查为 WebFluxTest (WebFluxTypeExcludeFilter) 配置的过滤器,它会将 WebFilter 添加到包含部分。这就是 Spring 选择它的原因。