Макет JWT Utils для проверки токена - PullRequest
1 голос
/ 21 июня 2020

Я хочу создать тест JUnkt для этой конечной точки:

    @Autowired
    private JwtTokenProvider jwtTokenProvider;

    @PostMapping("reset_token")
    public ResponseEntity<?> resetToken(@Valid @RequestBody ResetPasswordTokenDTO resetPasswordTokenDTO, BindingResult bindResult) {

        final String login = jwtTokenProvider.getUsername(resetPasswordTokenDTO.getResetPasswordToken());
    }

Полный код: Github

Тест JUnit:

@Test
public void resetTokenTest_NOT_FOUND() throws Exception {
    when(usersService.findByResetPasswordToken(anyString())).thenReturn(Optional.empty());

    mockMvc.perform(post("/users/reset_token")
            .contentType(MediaType.APPLICATION_JSON)
            .content(ResetPasswordTokenDTO))
            .andExpect(status().isNotFound());
}

Я получаю NPE в этой строке, когда запускаю код:

final String login = jwtTokenProvider.getUsername(resetPasswordTokenDTO.getResetPasswordToken());

Как я могу правильно имитировать jwtTokenProvider ? Как видите, у меня есть файл с test data , который я загружаю, но токен не извлекается. Вы знаете, как я могу исправить эту проблему?

Ответы [ 2 ]

2 голосов
/ 21 июня 2020

Вы можете рассмотреть возможность использования @MockBean непосредственно в вашем тестовом классе, чтобы имитировать ваш JwtTokenProvider. @ MockBean аннотация Spring-i sh и включена в spring-boot-starter-test. Документация Spring Boot хорошо обобщает это:

Spring Boot включает аннотацию @MockBean, которую можно использовать для определения mockito mock для bean-компонента внутри вашего ApplicationContext. Вы можете использовать аннотацию для добавления новых компонентов или замены одного существующего определения компонента. Аннотацию можно использовать непосредственно в тестовых классах, в полях вашего теста или в классах и полях @Configuration. При использовании в поле также внедряется экземпляр созданного макета. Мок-бины автоматически сбрасываются после каждого метода тестирования.

Аннотация @MockBean заставит Spring искать существующий одиночный компонент типа JwtTokenProvider в контексте своего приложения. Если он существует, макет заменит этот bean-компонент, а если он не существует, он добавляет новый макет в контекст приложения.

Ваш тестовый класс будет выглядеть следующим образом:

import org.springframework.boot.test.mock.mockito.MockBean;

@MockBean
@Qualifier("xxx") //If there is more than one bean of type JwtTokenProvider
private JwtTokenProvider jwtTokenProvider;

@Test
public void resetTokenTest_NOT_FOUND() throws Exception {

    when(jwtTokenProvider.getUsername(anyString())).thenReturn(Optional.empty());

    mockMvc.perform(post("/users/reset_token")
            .contentType(MediaType.APPLICATION_JSON)
            .content(ResetPasswordTokenDTO))
            .andExpect(status().isNotFound());
}

Вы также можете проверить это и это .

2 голосов
/ 21 июня 2020

Самый простой способ - использовать Mockito и создавать имитационные экземпляры и передавать их непосредственно в класс вашего контроллера с помощью внедрения конструктора.

Однако, если вы не используете wi sh to используйте инъекцию конструктора (я рекомендую вам использовать его, поскольку он гораздо более явный), вам нужно определить свои beans в отдельном классе конфигурации теста


@Profile("test")
@Configuration

public class TestConfiguration {
    @Bean
    public JwtTokenProvider mockJwtTokenProvider() {
        return Mockito.mock(JwtTokenProvider.class);
    }

}

Кроме того, добавьте правильный профиль в свой тестовый класс по @ActiveProfiles("test")

...