Введение
Одно время я запустить тест, который был заметки @SpringBootTest
и когда начал работать, уже появился Баннер Spring Boot, сообщения: contextLoader
Когда я увидел это, я уже видел, что я даже не знаю, почему использовать эти примечания и который следует использовать. Итак, цель этого поста показать, какие из них должны быть использованы для чего сценарий выбора.
Начальной Настройки
Для нашей начальной настройки, мы будем использовать по минимуму и пом понадобятся следующие depêndencias:
com.h2database h2 runtime org.springframework.boot spring-boot-starter-test test org.junit.vintage junit-vintage-engine org.springframework.boot spring-boot-starter-data-jpa
исключение junit-винтажный движок
é necessario para utilizaçao сделать блок 5 для использования junit-юпитер-двигатель
. Использование H2 будет проверить уровень данных.
Уровень услуг и Dto
Давайте создадим класс, ну просто, чтоб сделать некоторые тесты, для этого мы будем создавать пользователей:
public class User { private String name; private int age; private String document; public User(String name, int age, String document) { this.name = name; this.age = age; this.document = document; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getDocument() { return document; } public void setDocument(String document) { this.document = document; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + ", document='" + document + '\'' + '}'; } }
и тест, который будет работать на этот класс будет:
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; public class EntityTest { @Test public void UserTest() { User user = new User("name", 12, "DOC12543"); assertEquals("name", user.name); assertTrue(user.toString().contains("User{")); } }
И так уже реально работает в наших тестах в 135ms в то время как, если мы используем нотации @SpringBootTest
колеса в 459ms, кажется, немного, но давайте помнить, что этот тест является самым простым и наше приложение не имеет ничего настроен. Же diferenção между двумя тесты уже был более чем в три раза, вот только, чтобы проверить DTO.
Уровень данных
Для того чтобы испытать наш слой данных, давайте положить в наш класс User
атрибута @Entity
и ID , который становится обязательным:
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; private int age; private String document; public User(String name, int age, String document) { this.name = name; this.age = age; this.document = document; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getDocument() { return document; } public void setDocument(String document) { this.document = document; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + ", document='" + document + '\'' + '}'; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } }
А доступ мы будем делать через JpaRepository
только один метод:
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface UserRepository extends JpaRepository{ public User findUserByNameAndDocument(String name, String doc); }
После того как вы создали эти классы мы уже можем создать несколько тестов для этой части. Некоторые примеры можно увидеть ниже:
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.junit.jupiter.SpringExtension; import static org.junit.jupiter.api.Assertions.*; @ExtendWith(SpringExtension.class) @DataJpaTest public class UserRepositoryTests { @Autowired private UserRepository userRepository; @Test public void insertUser() { User user = new User("name", 11, "DOC12355"); userRepository.save(user); Integer countUser = userRepository.findAll().size(); assertEquals(1, countUser); } @Test public void checkUserSavedWithDocument() { User user = new User("name", 11, "DOC12355"); userRepository.save(user); Integer countUser = userRepository.findAll().size(); assertEquals(1, countUser); User user1 = userRepository.findUserByNameAndDocument("name", "DOC12355"); assertNotNull(user1); assertEquals(user, user1); } @Test public void checkUserSavedWithDocumentPassingOtherDocumentShouldReturnNull() { User user = new User("name", 11, "DOC12355"); userRepository.save(user); Integer countUser = userRepository.findAll().size(); assertEquals(1, countUser); User user1 = userRepository.findUserByNameAndDocument("name", "99999"); assertNull(user1); } }
С помощью @DataJpaTest
” помогает настроить некоторые вещи автоматически:
- Настройки H2 in-memory
- Весенние данные, Источник данных
- Модо де логар о SQL НА
режим входа в систему sql, чтобы в нашем случае выглядит так:
insert into user (age, document, name, id) values (?, ?, ?, ?) select user0_.id as id1_0_, user0_.age as age2_0_, user0_.document as document3_0_, user0_.name as name4_0_ from user user0_ select user0_.id as id1_0_, user0_.age as age2_0_, user0_.document as document3_0_, user0_.name as name4_0_ from user user0_ where user0_.name=? and user0_.document=?
Этот тест с @SpringBootTest
не катит.
Веб-Слой
Для веб-уровень, остальные уже сделал пост здесь, но в нашем случае пользователя мы будем создавать контроллер для пользователя, проще будет, который возвращает всех пользователей. Был бы более или менее так:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; import java.util.List; @Controller public class UserController { @Autowired private UserRepository userRepository; @GetMapping(value = "/users") @ResponseBody public ListfindAllUsers() { return userRepository.findAll(); } }
И простой тест, чтобы ответ на этот контроллер будет:
import org.hamcrest.Matchers; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; import java.util.List; import static org.hamcrest.Matchers.containsString; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @ExtendWith(SpringExtension.class) @WebMvcTest(controllers = UserController.class) class UserControllerTest { @Autowired private MockMvc mockMvc; @MockBean private UserRepository userRepository; @Test public void findAllUsers() throws Exception { User user = new User("teste", 25, "DOC12346"); ListuserList = List.of(user); when(userRepository.findAll()).thenReturn(userList); this.mockMvc.perform(get("/users")) .andExpect(status().isOk()) .andExpect(content().string(containsString("DOC12346"))); } }
В рамках этого теста мы используем MockMvc для вызова контроллера, помня, что это называется “фальшивый”, и @MockBean
выполнить макет нашей repository. Другое дело, что мы сделали, это добавить.
Завершение
Кроме этих есть еще несколько параметров automaticas, что вы можете проверить здесь , но всегда появляются новые инструменты. Но использовать правильный подход, чтобы часть, которую вы хотите проверить, будет способствовать использование кроме того, чтобы дать тебе скорость, так и во время запуска сколько в час развития
## Понравилось? Если понравилось, вот мои социальные сети, чтобы быть в курсе новых постов.
Twitter: luizleite_
Подергивание: код coffee_and_code
Linkedin: луис лейте оливейра
dev.to: луис лейте_
Оригинал: “https://dev.to/luizleite_/testes-realmente-unitarios-no-spring-boot-3gm8”