Карта, возвращаемая изменением ApplicationContext.getBeansOfType - WebFluxTest SpringBoot - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь сделать тест контроллера. И я обнаружил некоторые трудности при тестировании 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 (экземпляр компонента)}

, которые делают мой тест всегда не удался, потому что они не могут найти компонент с ключом «РЕГИСТРАЦИЯ». помогите пожалуйста, чего мне не хватает? и почему ключ всегда так меняется?

Спасибо за ваш ответ.

...