Домашняя работа 7#11
Conversation
Покрыл существующий код интеграционными тестами с weather API, добавил MVC-тесты на эндпоинт GET и POST, использовал TestContainers.
madoed
left a comment
There was a problem hiding this comment.
Доработать по комментариям( указал в первом месте, где встретилось, в нижеследующих не отмечал, но тоже надо поправить). Ответить на комментарии
| @@ -1,9 +1,15 @@ | |||
| weather.api.key=your_api_key | |||
| weather.api.key=c45a3b4355a94076bc8182632230610 | |||
|
|
||
| @AutoConfigureMockMvc(printOnlyOnFailure = false) | ||
| @WebMvcTest(WeatherApiController.class) | ||
| public class WeatherApiControllerIT { |
There was a problem hiding this comment.
Давай не сокращать IntegrationTest в "IT"
|
|
||
| @SpringBootTest | ||
| @Testcontainers | ||
| public class WeatherTypeServiceImpl { |
There was a problem hiding this comment.
Нет "Test" в имени тестового класса
Плюс тесты с Testcontainers падают у меня локально с Connection to localhost:5432 refused.
There was a problem hiding this comment.
Так же есть предложение использовать Testcontainers в виде singleton -> https://java.testcontainers.org/test_framework_integration/manual_lifecycle_control/
Какие плюсы у этого подхода:
- Запускаем контейнер с бд единожды
- Прогон миграций 1 раз
- Соответственно время прохождения тестов уменьшается
There was a problem hiding this comment.
Странно, у меня запускались 🤔 Сейчас посмотрю
There was a problem hiding this comment.
Всё так же не запускаются, ты создаешь контейнер, но не указываешь спрингу где ему БД найти
Это должно делаться через дополнительные проперти в test, либо программно https://www.baeldung.com/spring-dynamicpropertysource. Плюс для теста contextLoads отсуствует БД и ликвибейз, который у тебя включен по умолчанию не знает куда ему идти, т.к. по дефолтному пути (из основных application.properties) ничего не запущенно
| private static final String LOCATION = "Moscow"; | ||
| private static final LocalDateTime DATE_TIME = LocalDateTime.now(); | ||
| private static final double TEMPERATURE = 1.0; |
There was a problem hiding this comment.
Статика должны быть выше не статики
https://www.oracle.com/technetwork/java/codeconventions-150003.pdf (4 страница)
There was a problem hiding this comment.
Конвеншены могут быть разные, но обычно статика выше
| import static org.mockito.BDDMockito.given; | ||
| import static org.mockito.Mockito.verify; | ||
| import static org.mockito.Mockito.when; |
There was a problem hiding this comment.
выбор использования BDD алиасов в Mockito был осознанным?
There was a problem hiding this comment.
Да, я сначала не знал про BDD. А потом прочитал, что это намного лучше и читабельнее считается и решил тоже использовать.
There was a problem hiding this comment.
лучше что-то одно использовать, чтобы стиль был един в сервисе
| WeatherApi weatherApi = weatherApiClient.getCurrentWeather(LOCATION); | ||
|
|
||
| assertNotNull(weatherApi); |
There was a problem hiding this comment.
Согласен, она здесь не нужна. В начале её запихнул, когда толко изучал тему.
|
|
||
| assertNotNull(weatherApi); | ||
|
|
||
| when(weatherApiClient.getCurrentWeather(LOCATION)).thenReturn(weather); |
There was a problem hiding this comment.
Выше был уже созданный мок через BDD алиас
There was a problem hiding this comment.
Спешил( И не заметил, когда проверял просто до этого не использовал BDD, а тут решил поменять
| String request = mvcResult.getResponse().getContentAsString(); | ||
|
|
||
| assertThat(request).isEqualToIgnoringWhitespace(objectMapper.writeValueAsString(weather)); |
There was a problem hiding this comment.
Лучше через jsonPath https://www.baeldung.com/integration-testing-in-spring (пункт 4,2)
| @Testcontainers | ||
| public class CityServiceImplTest { | ||
| @Container | ||
| public static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:latest"); |
There was a problem hiding this comment.
Вроде бы в задании говорилось о H2 контейнере
There was a problem hiding this comment.
Писали в беседе, что можно юзать и Postgres
| @BeforeEach | ||
| public void cleanUp() { | ||
| cityRepository.deleteAll(); | ||
| } |
There was a problem hiding this comment.
Ещё есть вариант использовать @Sql аннотацию поверх класса, чтобы делать тоже самое, но через sql скрипт
| @@ -0,0 +1 @@ | |||
| DELETE FROM city_weather; No newline at end of file | |||
There was a problem hiding this comment.
а зачем скрипты удаления, кроме clean-up.sql?
Лучше чистить все данные, чтобы не было пересечений в последующих тестах. Ну и соответственно под каждый тест, создавать своё.
Иначе велика вероятность, что, кто-то сможет добавление теста, сломать что-то смежное
There was a problem hiding this comment.
В начале добавил, потом понял, что сущности связные и это неудобно
Покрыл существующий код интеграционными тестами с weather API, добавил MVC-тесты на эндпоинт GET и POST, использовал TestContainers.