Как следует из названия, это метод разработки программного обеспечения для внедрения зависимостей. Это также одна из наиболее важных концепций в разработке программного обеспечения, которая позволяет инженерам разрабатывать хорошо тестируемый и слабо связанный код.
Модульные тесты важны для обеспечения высокого качества кода и обеспечения того, чтобы бизнес-логика выполнялась должным образом. В рамках создания приложений корпоративного уровня в конечном итоге вам потребуется включить некоторую форму зависимостей. Эти зависимости могут быть, например:
- Внешний ресурс Api
- Подчеркните базу данных, используемую вашим приложением
В рамках принципов разработки, основанной на тестировании (TDD), тестируемый код должен избегать вызовов реальных служб и использования двойников тестов, которые могут принимать форму издевательств или заглушки должны быть включены таким образом, чтобы избежать отслаивания теста. Что такое слоеный тест? Это автоматизированный тест, который может пройти и завершиться неудачей без изменений в ваших существующих тестовых примерах, и вызван тем, что тест основан на реальных зависимостях, а не на использовании поддельных объектов для целей тестирования. Внедрение зависимостей затем помогает в тестировании, позволяя вводить эти зависимости в объект, который будет их использовать, вместо того, чтобы жестко привязывать зависимости к объекту.
Ниже перечислена структура нашего проекта Мы создадим Сервис для получения пользователя:
@Service public class UserService{ public User getUser() throws Exception { UnirestConfig.initialize(); HttpResponseuser = Unirest.get("https://api.mocki.io/v1/ce5f60e2").asObject(User.class); return user.getBody(); } }
Теперь, когда у нас есть наш сервис, это зависимость от проекта. Давайте создадим RestController, который будет использовать эту зависимость.
package com.vtechjm.core.resources; import com.vtechjm.core.services.UserService; import com.vtechjm.core.services.models.User; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/Users") class UserResource { private UserService userService; public UserResource(UserService userService) { this.userService = userService; } @GetMapping("/user") User getUser() throws Exception { return userService.getUser(); } }
Ключевым моментом здесь является передача нашей зависимости через конструктор. Это называется внедрением зависимостей конструктора. Обратите внимание, что здесь не используется ключевое слово new , и, следовательно, ответственность за создание экземпляра и передачу такой зависимости (IoC) лежит на клиенте.Spring Boot автоматически будет управлять созданием зависимости здесь, путем аннотирования с помощью @Service будет создан компонент. Ниже мы будем использовать Mockito, чтобы имитировать то, что должно быть возвращено при вызове метода getUser, имитируя поддельный вызов службы.
@SpringBootTest @AutoConfigureMockMvc class UserControllerTest { @Autowired private MockMvc mvc; @MockBean private UserService userServiceMock; @Test public void itShouldReturnAUser() throws Exception { //Arrange User mockUser = new User(); mockUser.setCity("Santa Cruz"); mockUser.setName("John Doe"); Mockito.when(userServiceMock.getUser()).thenReturn(mockUser); //Act mvc.perform(get("/api/Users/user").contentType(MediaType.APPLICATION_JSON)) .andExpect( status().isOk() ).andExpect( jsonPath("$.name").value("John Doe") ).andExpect( jsonPath("$.city").value("Santa Cruz")); } }
Теперь, когда у нас есть наши рабочие службы в качестве зависимого. Чтобы протестировать этот контроллер, мы будем использовать наш шаблон тестирования AAA, который:
- Организовать
- Действие
- Утверждать
Мы настроим наш макет сервиса в тестовом классе для обслуживания пользователей, выше spring boot введет зависимость через конструктор, как и раньше. Когда мы будем действовать в соответствии с тестируемым здесь методом, наш макет объекта будет возвращен и, таким образом, освободит нас от реального вызова службы, вызываемого при каждом запуске нашего теста.
Как видно выше, внедрение зависимостей необходимо для написания слабо связанного и проверяемого кода. Это повышает качество кода для проекта в целом. Я надеюсь, что этот пост был информативным, полный исходный код можно найти здесь.
Демонстрация VTechJm/Внедрение зависимостей
Оригинал: “https://dev.to/vtechjm/dependency-injection-and-unit-testing-with-mockito-in-spring-boot-java-2lag”