Проблема
В своем тесте вы создали службу SavingAccountService, которая использует внедренные имитаторы.
@InjectMocks
private SavingAccountService savingAccountService;
Проблема в том, что это не та служба, которую использует ваш контроллер. Spring boot test создает bean-компоненты, определенные в контексте приложения, автоматически подключает их и успешно игнорирует существование службы, определенной в test.
Решение
Вы должны сделать Spring с учетом загрузки bean-компонента Clock с фиксированным временем
Вариант 1: Mock bean
Вы определяете
@MockBean
private Clock clock;
private Clock fixedClock;
, и вам должно быть хорошо go.
Я все еще считаю этот метод запутанным, я бы хотел передать фиксированные часы как bean-компонент в контекст Spring Boot, вместо того, чтобы создавать макеты.
Вариант 2: Укажите классы компонентов, которые будут использоваться для загрузки ApplicationContext.
Создайте новый класс конфигурации в ваших тестовых каталогах
@Configuration
public class FakeClockConfig {
private final static LocalDate WEEKEND = LocalDate.of(2020, 07, 05);
@Bean
public Clock clock() {
return Clock.fixed(WEEKEND.atTime(9, 5).toInstant(ZoneOffset.UTC), ZoneId.of("CET"));
}
}
Сообщите Spring Boot test об этой дополнительной конфигурации
@SpringBootTest(webEnvironment = RANDOM_PORT,
classes = {ChallengeApplication.class, FakeClockConfig.class})
Я считаю этот метод предпочтительным, вы уже сами указываете один класс компонента.
Часы с постоянным временем заменят ваши оригинальные часы
Вариант 3: @ TestConfiguration
* 104 4 * См.
Spring boot - @ TestConfiguration @ TestConfiguration - это специализированная форма @Configuration, которая может использоваться для определения дополнительных компонентов или настроек для теста.
При весенней загрузке любые bean-компоненты, настроенные в классе верхнего уровня с аннотацией @TestConfiguration, не будут обнаружены при сканировании компонентов. Мы должны явно зарегистрировать класс @TestConfiguration в классе, который содержит тестовые примеры.
Есть два способа включить эту дополнительную тестовую конфигурацию для тестов:
1.1. Аннотация @Import
1.2. Stati c вложенные классы
Давайте go с последним подходом:
@SpringBootTest(properties = "spring.main.allow-bean-definition-overriding=true")
public class ProjetRepositoryTest {
private static final LocalDate WEEKEND = LocalDate.of(2020, 07, 05);
@TestConfiguration
static class FakeClockConfig {
@Bean
public Clock clock() {
return Clock.fixed(WEEKEND.atTime(9, 5).toInstant(ZoneOffset.UTC), ZoneId.of("CET"));
}
}
}
Обратите внимание, что этот метод создает дополнительные bean-компоненты, поэтому мне нужно было разрешить переопределение bean.
См. Spring-Boot 2.1.x и определение переопределения bean-компонента
Другие примечания
Похоже, вы используете TestRestTemplate для бэкэнда тесты. Вместо этого вы можете использовать Mock Mvc.
См. Разница между Mock Mvc и RestTemplate в интеграционных тестах