Introdução
速度与力量的共鸣@SpringBootTesteQuandocomeçouarodar,jáapareceuoBannerdoSpringBoot eumamensagem: contextLoader='org.springframework.boot.test.context.SpringBootContextLoader'
Quando eu vi isso,eu ja que eu nem sabia或quéde utilizar essaanotaçãoe qual deveria usar。 Entãoo Objetivo 事后证明最有效的方法。
Setup Inicial
初始设置,vamos utilizar omínimoe o pom vai precisar das seguintesdepêndencias:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
独家做老式发动机使用JUnit5的实用程序朱尼木星引擎。 O 2 2相机在加拿大。
Camada de serviços e DTOs
Vamos criar uma classe bem simples pra fazer alguns睾丸,para isso vamos criar umusuário:
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 + '\'' +
'}';
}
}
e teste que vai执行者sobre essa classe vai ser:
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{"));
}
}
135毫秒内,Esste jeitojátárodando os nossos的睾丸@SpringBootTestRoda em 459ms, parece pouco mas vamos lembrar que esse testeéo mais simples e nossaaplicaçãonãotem nada configurado。 Mesmo assim 在DTO上进行验证的另一种方法。
Camada de dados
Para testar nossa camada de dados vamos dar colocar em nossa classe用户um atributo@实体oID菲卡河原产地:
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;
}
}
E o acesso vamos fazer通过Jpa存储库com apenas ummétodo:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
public User findUserByNameAndDocument(String name, String doc);
}
De pois de ter criado essas课堂jápodemos criar alguns testes para essa parte。 Alguns exemplos podem ser vistos seguir:
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);
}
}
Utilizando@DataJpaTestajuda一种可配置的算法,可以自动执行:
- H2内存中的配置Spring Data,数据源合法的SQL模式
o逻辑对数或sql para或nosso caso fica assim:
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=?
Esse Teste com@SpringBootTestnãoroda。
Camada Web
Para camada web a gente já fez um post aqui
mas para o nosso caso de usuário vamos criar um controller para usuário, o mais simples seria o que retorna todos os usuários. Ficaria mais ou menos assim:
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<User> 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<User> userList = List.of(user);
when(userRepository.findAll()).thenReturn(userList);
this.mockMvc.perform(get("/users"))
.andExpect(status().isOk())
.andExpect(content().string(containsString("DOC12346")));
}
}
Dentro desse teste utilizamos o MockMvc para fazer a chamada do controller,lembrando que issoéuma chamada“ fake”, o@MockBean最好的模拟执行Nosso存储库。 Outra coisa que fizemos foi adicionar。
Conclusão
Além destes existem mais algumas configurações automaticas que você pode checar aqui,
mas sempre surgem novas ferramentas. Mas utilizar a abordagem correta para parte que você deseja testar, vai facilitar o uso
além de te dar velocidade, tanto na hora de rodar, quanto na hora do desenvolvimento
## Gostou? Se gostou aquiestãominhas redes sociais para acompanhar os novos posts。
Twitter: luizleite_
Twitch: coffee_and_code
Linkedin: luizleiteoliveira
dev.to: luizleite_
所有评论(0)