Мне сложно тестировать свою конечную точку, когда я устанавливаю определенную дату.
Я не хочу использовать PowerMock для имитации статического метода, вместо этого я решил изменить реализацию своего сервиса и использовать реализацию LocalDate.now(Clock clock) так, чтобы ее было легче тестировать.
Я добавил в свой класс SpringBootApplication:
@Bean
public Clock clock() {
return Clock.systemDefaultZone();
}
и автоматически подключил его к моей службе
@Autowired
private Clock clock;
и использовал его в своей реализации следующим образом:
LocalDateTime localDate = LocalDateTime.now(clock);
На тестовой стороне я издевался над часами
private final static LocalDate WEEKEND = LocalDate.of(2020, 07, 05);
@Mock
private Clock clock;
private Clock fixedClock;
и использовал его так:
MockitoAnnotations.initMocks(this);
//tell your tests to return the specified LOCAL_DATE when calling LocalDate.now(clock)
fixedClock = Clock.fixed(WEEKEND.atTime(9, 5).toInstant(ZoneOffset.UTC), ZoneId.of("CET"));
doReturn(fixedClock.instant()).when(clock).instant();
doReturn(fixedClock.getZone()).when(clock).getZone();
ResponseEntity response = restTemplate.postForEntity(base.toString(), request, String.class);
Когда я отлаживал его, значение fixClock имело то значение, которое я ожидал. FixClock[2020-07-05T09:05:00Z,CET]. Вместо этого, если я поставлю точку останова на реализацию службы, переменная localDate будет иметь значение 2020-07-09 - .now().
Моя проблема заключается в следующем: почему переменная localDate не имеет значения переменной fixClock?
Большое спасибо за уделенное время!
Позже изменить:
Вот конструктор Сервиса:
@Autowired
public SavingAccountService(
SavingAccountRepository savingAccountRepository, UserRepository userRepository, Clock clock) {
this.savingAccountRepository = savingAccountRepository;
this.userRepository = userRepository;
this.clock = clock;
}
Аннотации к моему TestClass:
RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = RANDOM_PORT, classes = ChallengeApplication.class)
@ActiveProfiles("test")
public class SavingAccountTest {
@Mock
private Clock clock;
private Clock fixedClock;
@InjectMocks
private SavingAccountService savingAccountService;
@Autowired
private TestRestTemplate restTemplate;
private URL base;
@LocalServerPort
int port;
Я также хочу отметить, что в ходе своего теста я вызываю Контроллер, а не Службу.
private final SavingAccountService savingAccountService;
public SavingAccountRestController(SavingAccountService savingAccountService) {
this.savingAccountService = savingAccountService;
}
@Override
@PostMapping
public ResponseEntity newSavingAccount(@RequestBody SavingAccount savingAccount) {
EntityModel newSavingAccount = savingAccountService.newSavingAccount(savingAccount);
return new ResponseEntity(newSavingAccount, HttpStatus.CREATED);
}
Мокайте LocalDate.now(часы) с помощью Clock.fixed() ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1777538457
Anonymous
Мне сложно тестировать свою конечную точку, когда я устанавливаю определенную дату.
Я не хочу использовать PowerMock для имитации статического метода, вместо этого я решил изменить реализацию своего сервиса и использовать реализацию LocalDate.now(Clock clock) так, чтобы ее было легче тестировать.
Я добавил в свой класс SpringBootApplication:
@Bean
public Clock clock() {
return Clock.systemDefaultZone();
}
и автоматически подключил его к моей службе
@Autowired
private Clock clock;
и использовал его в своей реализации следующим образом:
LocalDateTime localDate = LocalDateTime.now(clock);
На тестовой стороне я издевался над часами
private final static LocalDate WEEKEND = LocalDate.of(2020, 07, 05);
@Mock
private Clock clock;
private Clock fixedClock;
и использовал его так:
MockitoAnnotations.initMocks(this);
//tell your tests to return the specified LOCAL_DATE when calling LocalDate.now(clock)
fixedClock = Clock.fixed(WEEKEND.atTime(9, 5).toInstant(ZoneOffset.UTC), ZoneId.of("CET"));
doReturn(fixedClock.instant()).when(clock).instant();
doReturn(fixedClock.getZone()).when(clock).getZone();
ResponseEntity response = restTemplate.postForEntity(base.toString(), request, String.class);
Когда я отлаживал его, значение fixClock имело то значение, которое я ожидал. FixClock[2020-07-05T09:05:00Z,CET]. Вместо этого, если я поставлю точку останова на реализацию службы, переменная localDate будет иметь значение 2020-07-09 - .now().
Моя проблема заключается в следующем: почему переменная localDate не имеет значения переменной fixClock?
Большое спасибо за уделенное время!
Позже изменить:
Вот конструктор Сервиса:
@Autowired
public SavingAccountService(
SavingAccountRepository savingAccountRepository, UserRepository userRepository, Clock clock) {
this.savingAccountRepository = savingAccountRepository;
this.userRepository = userRepository;
this.clock = clock;
}
Аннотации к моему TestClass:
RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = RANDOM_PORT, classes = ChallengeApplication.class)
@ActiveProfiles("test")
public class SavingAccountTest {
@Mock
private Clock clock;
private Clock fixedClock;
@InjectMocks
private SavingAccountService savingAccountService;
@Autowired
private TestRestTemplate restTemplate;
private URL base;
@LocalServerPort
int port;
Я также хочу отметить, что в ходе своего теста я вызываю Контроллер, а не Службу.
private final SavingAccountService savingAccountService;
public SavingAccountRestController(SavingAccountService savingAccountService) {
this.savingAccountService = savingAccountService;
}
@Override
@PostMapping
public ResponseEntity newSavingAccount(@RequestBody SavingAccount savingAccount) {
EntityModel newSavingAccount = savingAccountService.newSavingAccount(savingAccount);
return new ResponseEntity(newSavingAccount, HttpStatus.CREATED);
}
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия