Java ApplicationContext.getBeansOfType更改返回的映射-WebFluxTest SpringBoot
我想做一个控制器测试。在控制器中测试applicationContext.getBeansOfType时,我发现了一些困难 下面是我的控制器代码片段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 )
@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()
}
}