Изменение параметра даты Rest API при запуске теста junit - PullRequest
2 голосов
/ 16 мая 2019

Я сделал 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...