Jasypt не расшифровывает свойства во время тестирования junit, но отлично работает при запуске приложения spring boot

#java #spring #spring-boot #junit #jasypt

#java #spring #spring-boot #junit #jasypt

Вопрос:

У меня есть приложение Spring Boot с несколькими свойствами, зашифрованными с помощью Jasypt, и я предоставляю секретный ключ со следующей опцией виртуальной машины: -Djasypt.encryptor.password=secretkey

Все работает отлично, когда я запускаю свое приложение локально и в рабочей среде. Проблема в том, что я не уверен, что мне нужно сделать, чтобы расшифровать свойства, которые я зашифровал в своем файле application-test.properties, который я использую во время тестов JUnit. Я даже передаю ту же опцию виртуальной машины, что и выше, в свой тест JUnit.

Я не получаю никаких исключений во время тестирования JUnit, которые объясняли бы мне, почему я не могу расшифровать, но свойства, которые мне нужны для расшифровки, просто не расшифровываются. Возможно ли это вообще или есть какая-то конфигурация, с помощью которой я могу настроить свои тесты для использования дешифрования Jasypt.

Я включу приведенный ниже код. Тест, который я выполняю, в частности, для метода JavaMailService. У меня есть пароль, зашифрованный в application-test.properties, и тест завершается неудачно, поскольку он не может аутентифицировать пользователя (поскольку пароль все еще зашифрован)

application-test.properties:

 spring.mail.password=ENC(1NrovUC7 YAzVNhbbpHkRi9TghEPys0aQk1nXonk354=)
  

Основной тестовый класс:

 @RunWith(SpringRunner.class)
@WebMvcTest(value = { ApiController.class, RestController.class })
@ContextConfiguration(classes = { MyApplication.class, EmailService.class, EmailServiceTestConfig.class })
@ActiveProfiles("test")
class MyApplicationTests {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testSendEmail() throws Exception {
        ...
    }

}
  

Класс EmailServiceTestConfig:

 @SpringBootConfiguration
public class EmailServiceTestConfig {

    @Value("${spring.mail.username}")
    private String username;

    @Value("${spring.mail.password}")
    private String password;

    @Bean
    public JavaMailSender javaMailService() {
        ...
    }

    private Properties getMailProperties() {
        ...
    }
}
  

Я пропустил некоторую неважную информацию, однако из этого класса EmailServiceTestConfig я проверил пароль, полученный из файла свойств, и он не был расшифрован. Любые идеи, пожалуйста, дайте мне знать! Если я найду решение, я также опубликую здесь. Любая дополнительная информация, которая вам может понадобиться, пожалуйста, дайте мне знать!

Комментарии:

1. Не использовал jasypt, но, похоже, вам нужно активировать компоненты jasypt в вашем приложении. Хотя этот jasypt spring2 относится к Spring 2, вы можете найти некоторую полезную информацию о том, как активировать их в вашем приложении.

2. Вы нашли решение для этого? У меня та же проблема

Ответ №1:

У меня была та же проблема, с которой я аннотировал тестовый класс @Import(EnableEncryptablePropertiesConfiguration.class) .

Да, с ним все работало нормально @SpringBootTest , но загрузка всего приложения занимала так много времени.

Ответ №2:

Решаемая проблема. Мне нужно было аннотировать тестовый класс моего приложения с помощью @SpringBootTest . Как только я это сделал, пароль был расшифрован. Не уверен на 100%, как и почему, но я считаю, что аннотация SpringBootTest была необходима для подключения Jasypt к среде Spring Boot во время выполнения тестов.

Комментарии:

1. Тоже не работает

Ответ №3:

У меня была аналогичная проблема с аннотированными тестами @SpringBootTest. Когда приложение запускается с помощью теста, оно пытается расшифровать пароли из файлов свойств. Поскольку я не хочу ни помещать секрет в файл application-test.properties, ни запускать тесты каждый раз с секретом вручную, контекст приложения не удалось загрузить, и тесты завершились неудачно. Но я нашел следующее обходное решение.

 jasypt.encryptor.property.prefix=[[[[[
jasypt.encryptor.property.suffix=]]]]]
  

Я поместил их в свое приложение-test.properties.
Таким образом, jasypt не видит мои пароли в свойствах как зашифрованные, поскольку я перезаписываю стандартный суффикс ENC(префикс и ).
Теперь все мои тесты выполняются. И поскольку мне не нужны расшифрованные пароли в моих тестах, все работает.

Не имеет значения, что вы вводите в качестве префикса или суффикса, это просто не должно быть началом свойства в ваших файлах, поэтому jasypt пытается расшифровать что-то еще.