Я сделал Rest API с фреймом Spring, API возьмет дату и найдет запись из базы данных и вернет запись, в базе данных будут столбцы даты начала и окончания на основе указанной даты , он должен возвращать все записи, между которыми находится данная дата.
Я использую версию Oracle Java Database 8 и Spring Frome Work Boot 2.1.2, проблема заключается в том, что я делаю тестовый джунит с Mokito, чтобы проверить REST API, который я сделал, когда я передаю дату, когда мой метод получает дата, когда он изменил дату, я обнаружил, что кажется, что когда он получает дату, которую он преобразовал в другой часовой пояс (+1 часовой пояс), и часовой пояс моего локального компьютера устанавливается на -6 часовой пояс, если я преобразовываю дату в +1, Тест будет успешным, если я просто передам объект даты, он автоматически преобразует его в +1 часовой пояс, который будет пропущен.
Я хотел бы знать, почему, поскольку я тестирую их в одном и том же месте, почему дата все еще меняется, и с пониманием я предпочитаю ее решение.
поэтому у меня будет таблица в базе данных с
product_category_id (long), start_date (date), end_date (date)
и второй стол с
Product_id (long), type_code (short), цена (double), product_category_id
и они связаны с product_category_id
вот метод в файле контроллера
@GetMapping("/{startDate}")
public ResponseEntity<List<ProductCategoryResource>> findByDate(
@PathVariable("startDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) final Date startDate)
{
final List<ProductCategory> productCategoryList =
ProductCategoryService.findByDate(startDate);
final List<ProductCategoryResource> productCategoryResourceList = new ArrayList<>();
for (final ProductCategory productCategory: productCategoryList)
{
productCategoryResourceList.add(new ProductCategoryResource(productCategory));
}
return new ResponseEntity<>(ProductCategoryResourceList, HttpStatus.OK);
}
вот услуга
public List<ProductCategory> findByDate(final Date searchDate)
{
return ProductCategoryRepository
.findByStartDateLessThanEqualAndEndDateGreaterThanEqual(searchDate,
searchDate);
}
и репозиторий является просто интерфейсом по умолчанию, расширяет CrudRepository, с методом findByStartDateLessThanEqualAndEndDateGreaterThanEqual внутри.
вот мой джунит-тест.
public void findByDate() throws Exception{
final String pattern = "yyyy-MM-dd";
final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
final Date searchDate = simpleDateFormat.parse("2018-05-22");
//Here mock all return values and add to result list
BDDMockito.given(ProductCategoryService.findByDate(searchDate)).willReturn(resultList);
mvc.perform(MockMvcRequestBuilders.get("/productCategory/2018-05-22")
.contentType(MediaType.APPLICATION_JSON)).andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.jsonPath("$[0].startDate", Matchers
.startsWith(simpleDateFormat.format(resultList.get(0).getProductCategoryStartDate()))));
}
, так что это даст ошибку $ [0] .startDate имеет значение null, которое не вернуло фиктивный список результатов, я отладил и обнаружил, что когда он попадает в метод в контроллере, дата меняется на Пн 21 мая 18: 00:00 CST 2018, поэтому дата не совпадает с датой, указанной в BDDMockito.given. но если я изменю свой местный часовой пояс на +1, он будет точно таким же
Я ожидал, независимо от того, в каком часовом поясе я запускаю сборку проекта, тест никогда не завершается неудачей, он всегда должен посылать одну и ту же дату, потому что он действительно прошел по URL.