Java ApplicationContext.getBeansOfType更改返回的映射-WebFluxTest SpringBoot

Java ApplicationContext.getBeansOfType更改返回的映射-WebFluxTest SpringBoot,java,spring,spring-boot,unit-testing,spring-webflux,Java,Spring,Spring Boot,Unit Testing,Spring Webflux,我想做一个控制器测试。在控制器中测试applicationContext.getBeansOfType时,我发现了一些困难 下面是我的控制器代码片段 @RestController @RequestMapping(value = "/api/bridge") public class BridgeController { @RequestMapping( value = "/visitor", method = RequestMethod.POST )

我想做一个控制器测试。在控制器中测试applicationContext.getBeansOfType时,我发现了一些困难

下面是我的控制器代码片段

@RestController
@RequestMapping(value = "/api/bridge")
public class BridgeController {

    @RequestMapping(
      value = "/visitor",
      method = RequestMethod.POST
    )
    public Mono<Response<Boolean>> visitorEvent(
      @RequestBody VisitorEventWebRequest webRequest) {

      return Mono
          .fromCallable(() -> constructVisitorEventCommandRequest(webRequest))
          .flatMap(register -> 
              commandExecutor.execute(getVisitorFactory(webRequest).getClass(),register)
              .subscribeOn(SchedulerHelper);
     }
}
然后,在我的控制器测试中,我模拟了applicationContext.getBeansOfType,它将返回我在@Before方法中声明的映射。我正在使用SpringExtension和WebFluxTest。下面是代码片段

@ExtendWith(SpringExtension.class)
@WebFluxTest(controllers = BridgeController.class)
public class BridgeVisitorControllerTest {

   @Autowired
   private WebTestClient testClient;

   @MockBean
   private ApplicationContext applicationContext;

   @MockBean
   private RegisterEventCommandImpl registerEventCommandImpl;

   private Map<String, VisitorEventAbstract> visitorEventAbstractContext;

   @BeforeEach
   public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);

    this.visitorEventAbstractContext = new HashMap<>();
    this.visitorEventAbstractContext.put("REGISTRATION", this.registerEventCommandImpl);
  }

  @Test
  public void execute() {

   /// some code

   when(applicationContext.getBeansOfType(VisitorEventAbstract.class))
        .thenReturn(this.visitorEventAbstractContext);
   when(commandExecutor.execute(eq(VisitorEventAbstract.class), any()))
        .thenAnswer(ans -> Mono.just(Boolean.TRUE));

   /// testClient.post()

  }
}
@ExtendWith(SpringExtension.class)
@WebFluxTest(控制器=BridgeController.class)
公共类BridgeVisitorControllerTest{
@自动连线
私有WebTestClient测试客户端;
@蚕豆
私有应用程序上下文应用程序上下文;
@蚕豆
专用注册表EventCommandImpl注册表EventCommandImpl;
私有地图访问ventabstractcontext;
@之前
public void setUp()引发异常{
initMocks(this);
this.visitorEventAbstractContext=new HashMap();
this.visitorEventStractContext.put(“注册”,this.registerEventCommandImpl);
}
@试验
public void execute(){
///一些代码
当(applicationContext.getBeansOfType(VisitorEventAbstract.class))
.然后返回(此.visitoreventablestractcontext);
when(commandExecutor.execute(eq(visitorentabstract.class),any())
.thenAnswer(ans->Mono.just(Boolean.TRUE));
///testClient.post()
}
}
因此,由于我已经初始化了映射,并模拟了applicationContext,我希望当controllerTest在getVisitorFactory(webRequest方法)中运行时,它会像这样返回映射

{ “密钥”:“注册”, “value”:RegisterEventCommandImpl(已被模拟的bean实例) }

但是,实际上,返回的映射总是这样更改密钥:

{ “key”:“{注册表项EventCommandImpl的包名称}”, “值”:RegisterEventCommandImpl(bean实例) }

这使得我的测试总是失败,因为他们找不到密钥为“REGISTRATION”的bean。请帮忙,我错过了什么?为什么关键总是这样变化


谢谢您的回答。

如果您只想手动检索bean,那么首先为什么要在spring上下文中注册bean?@ThomasAndolf您的意思是在测试类中吗?因为如果我没有初始化它,当调用特定函数(applicationContext.getBeansOfType)时,它将不会返回任何映射。如果我的理解有误,请纠正。
@ExtendWith(SpringExtension.class)
@WebFluxTest(controllers = BridgeController.class)
public class BridgeVisitorControllerTest {

   @Autowired
   private WebTestClient testClient;

   @MockBean
   private ApplicationContext applicationContext;

   @MockBean
   private RegisterEventCommandImpl registerEventCommandImpl;

   private Map<String, VisitorEventAbstract> visitorEventAbstractContext;

   @BeforeEach
   public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);

    this.visitorEventAbstractContext = new HashMap<>();
    this.visitorEventAbstractContext.put("REGISTRATION", this.registerEventCommandImpl);
  }

  @Test
  public void execute() {

   /// some code

   when(applicationContext.getBeansOfType(VisitorEventAbstract.class))
        .thenReturn(this.visitorEventAbstractContext);
   when(commandExecutor.execute(eq(VisitorEventAbstract.class), any()))
        .thenAnswer(ans -> Mono.just(Boolean.TRUE));

   /// testClient.post()

  }
}