Рубрики
Без рубрики

Семенники realmente unitários без пружинного ботинка

Введение Одно время я запустить тест, который был аннотацию @SpringBootTest и когда… С тегами java, тестирование, весна.

Введение

Одно время я запустить тест, который был заметки @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 List findAllUsers() {
        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");
        List userList = 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”