Spring LocaleContextHolder установлен неправильно - PullRequest
0 голосов
/ 13 февраля 2020

У меня проблемы с Spring LocaleContextHolder.

У меня следующий код:

public void sendPasswordRecoverySmsAsync(String phone) {
    CompletableFuture.runAsync(() -> {
        sendPasswordRecoverySmsSync(phone);
    });
}

public void sendPasswordRecoverySmsSync(String phone) {
    User user = userDao.findByPhone(phone, User.class).orElseThrow(() -> new UserNotFoundException(phone));
    log.info("User found, recovering password");
    user.setUpdateTime(LocalDateTime.now());
    userDao.save(user);

    int otp = codesGenerator.generateOtp(user.getUpdateTime());

    // Sends the SMS.
    Locale locale = LocaleContextHolder.getLocale();
    System.out.println("locale " + locale);
    String appName = messageSource.getMessage("app.name", null, locale);
    String smsContent = messageSource.getMessage("sms.password.recovery", new Object[] { otp }, locale);
    Message message = new TextMessage(appName, phone, smsContent);
    try {
        smsClient.submitMessage(message);
    } catch (NexmoClientException | IOException e) {
        log.error("Error while sending recovery password message to phone number [{}]", phone, e);
        throw new UserActivationException("Error while recovering password for user with phone: " + phone, e);
    }
}

и этот тест:

@Before
public void setup() {
    LocaleContextHolder.resetLocaleContext();
    Mockito.when(tokenGenerator.generateOtp(Mockito.any())).thenReturn(14);
}

@Test(timeout = 3000)
public void testSendPasswordRecoverySmsAsyncError() throws Exception {
    // Mocks.
    LocaleContextHolder.setLocale(Locale.ENGLISH, true);
    String mockPhone = "333";
    User mockUser = mockModelBuilder.user(true, true);
    Mockito.when(userDao.findByPhone(mockPhone, User.class)).then(r -> {
        // TODO
        return Optional.of(mockUser);
    });
    CountDownLatch latch = new CountDownLatch(1);
    ArgumentCaptor<TextMessage> messageCaptor = ArgumentCaptor.forClass(TextMessage.class);
    Mockito.when(smsClient.submitMessage(messageCaptor.capture())).then(r -> {
        latch.countDown();
        throw new NexmoClientException();
    });

    // Test.
    service.sendPasswordRecoverySmsAsync(mockPhone);
    latch.await();

    // Assertions.
    Assert.assertTrue(true);
    TextMessage actualMessage = messageCaptor.getValue();
    Assert.assertEquals("myApp", actualMessage.getFrom());
    Assert.assertEquals(mockPhone, actualMessage.getTo());
    Assert.assertEquals("Your password recovery code for myApp app is 14", actualMessage.getMessageBody());
}

I ожидал, что результат моего теста будет "en", и это будет работать правильно, если я запусту только этот тест. Тем не менее, когда я запускаю все свои тесты, вывод «это». Вероятно, это либо потому, что в других тестах я установил ИТАЛЬЯНСКИЙ языковой стандарт, либо потому, что он получает системную настройку по умолчанию.

Но почему он ошибается, даже если я его сбрасываю явно?

...