Мокайте LocalDate.now(часы) с помощью Clock.fixed()JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Мокайте LocalDate.now(часы) с помощью Clock.fixed()

Сообщение 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);
}
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»