Невозможно использовать собственный преобразователь пружины в модульном тесте - PullRequest
0 голосов
/ 03 января 2019

Я использую простой конвертер для преобразования строки в enum.Вот пользовательский конвертер:

@Component
public class SessionStateConverter implements Converter<String, UserSessionState> {

    @Override
    public UserSessionState convert(String source) {
        try {
            return UserSessionState.valueOf(source.toUpperCase());
        } catch (Exception e) {
            LOG.debug(String.format("Invalid UserSessionState value was provided: %s", source), e);

            return null;
        }
    }
}

В настоящее время я использую UserSessionState в качестве PathVariable в моем контроллере покоя.Реализация работает как положено.Однако, когда я пытаюсь выполнить модульное тестирование остального контроллера, кажется, что преобразование не работает и он не затрагивает метод контроллера.

@RunWith(MockitoJUnitRunner.class)
public class MyTest {
private MockMvc mockMvc;

@Mock
private FormattingConversionService conversionService;

@InjectMocks
private MynController controller;


@Before
public void setup() {
    conversionService.addConverter(new SessionStateConverter());
    mockMvc = MockMvcBuilders.standaloneSetup(controller).setConversionService(conversionService).build();
}


 @Test
public void testSetLoginUserState() throws Exception {
    mockMvc.perform(post("/api/user/login"));
}

}

В режиме отладки я получаю следующую ошибку:

nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'rest.api.UserSessionState': no matching editors or conversion strategy found

На мой взгляд, макет сервиса конвертации не работает.Есть идеи?

Ответы [ 2 ]

0 голосов
/ 19 июля 2019

Если кто-либо использует инструменты org.springframework.core.convert.converter.Converter<IN,OUT> и если вы получаете похожую ошибку при использовании mockMvc, следуйте приведенному ниже методу.

@Autowired
  YourConverter yourConverter;

  /** Basic initialisation before unit test fires. */
  @Before
  public void setUp() {
    FormattingConversionService formattingConversionService=new FormattingConversionService();
    formattingConversionService.addConverter(yourConverter); //Here

    MockitoAnnotations.initMocks(this);
    this.mockMvc = MockMvcBuilders.standaloneSetup(getController())
        .setConversionService(formattingConversionService) // Add it to mockito
        .build();
  }
0 голосов
/ 03 января 2019

conversionService это макет.

Так вот:

conversionService.addConverter(new SessionStateConverter());

звонит addConverter на макет.Это ничего не дает для вас.

Я полагаю, вы хотите использовать реальный FormattingConversionService: для этого вам нужно удалить аннотацию @Mock из поля conversionService и использовать вместо нее реальный экземпляр FormattingConversionService:

private FormattingConversionService conversionService = new FormattingConversionService();

Если вам нужно отслеживать вызовы на реальных объектах, как если бы вы делали это на макете, проверьте: @Spy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...