Я пытаюсь сделать тест контроллера. И я обнаружил некоторые трудности при тестировании 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);
}
}
с getVisitorFactory (webRequest) - это метод для вызова экземпляр сервиса beans, основанный на его eventType (это поле в webRequest)
private VisitorEventAbstract getVisitorFactory(VisitorEventWebRequest webRequest) {
try {
VisitorEventAbstract command = this.applicationContext.getBeansOfType(VisitorEventAbstract.class)
.getOrDefault(webRequest.getEventType(), null);
if(command == null) {
throw new RuntimeException();
}
return command;
} catch (Exception e) {
log.error("Error getting visitor event abstract implementation for event type : {}",
webRequest.getEventType());
throw new RuntimeException();
}
}
И затем, в моем тесте контроллера, я имитирую 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()
}
}
Итак, поскольку я инициализировал карту и смоделировал applicationContext, я ожидаю, что при запуске controllerTest в getVisitorFactory (метод webRequest) он вернет карту следующим образом
{"key": "REGISTRATION", "value": RegisterEventCommandImpl (экземпляр объекта, который был смоделирован)}
, но в действительности возвращаемая карта всегда изменялась ключ как это:
{"ключ": "{имя пакета RegisterEventCommandImpl}", "value": RegisterEventCommandImpl (экземпляр компонента)}
, которые делают мой тест всегда не удался, потому что они не могут найти компонент с ключом «РЕГИСТРАЦИЯ». помогите пожалуйста, чего мне не хватает? и почему ключ всегда так меняется?
Спасибо за ваш ответ.