@Test
Après la version Springboot2.0, Junit est la version de 5. Quelques-uns, ajoutez simplement @Test à la méthode
@Test
void fun1(){
int res = 1+1;
Assertions.assertEquals(2,res);
System.out.println(123);
}
@BeforeEach et @AfterEach
Il sera exécuté à chaque fois que @Test est exécuté
@BeforeEach
void before(){
System.out.println("before");
}
@AfterEach
void after(){
System.out.println("after");
}
@Test
void fun1(){
int res = 1+1;
Assertions.assertEquals(2,res);
System.out.println(123);
}
@Test
void fun2(){
System.out.println(456);
}
@BeforeAll et @AfterAll
Peu importe le nombre de @Tests, ils ne sont exécutés qu'une seule fois et les méthodes sous @BeforeAll & AfterAll doivent être des méthodes statiques
@BeforeAll
static void init(){
System.out.println("init");
}
@AfterAll
static void destory(){
System.out.println("destory");
}
@BeforeEach
void before(){
System.out.println("before");
}
@AfterEach
void after(){
System.out.println("after");
}
@Test
void fun1(){
int res = 1+1;
Assertions.assertEquals(2,res);
System.out.println(123);
}
@Test
void fun2(){
System.out.println(456);
}
@SpringBootTest
Dans le projet SpringBoot, lorsque nous créons une classe dans la classe de test, cette classe peut également impliquer d'autres beans, et le @Test d'origine n'implique pas le contexte de Springboot, donc lorsque nous écrivons la classe de test dans le projet SpringBoot, nous ajoutons @ SpringBootTest sur la classe, trouvera un partenaire junior attentif dans la sélection de projet que nous avons créée Spring Initializr
lorsque vous créez un projet SpringBoot, il y aura un répertoire de fichiers de test, vous verrez automatiquement créé avec le meilleur de la classe de test @SpringBootTest
En même temps, il peut également coopérer avec l'injection de @Autowired
@SpringBootTest //能够初始化springboot的上下文,防止new Serv01 的对象同时依赖其他的Bean
public class Test2 {
@Autowired
Serv01 serv01;
@Test
void t1(){
int add = serv01.add(1, 1);
Assertions.assertEquals(2,add);
System.out.println(11);
}
}
Bien sûr, exécuter ce cas de test avec @SpringBootTest démarrera également notre projet SpringBoot
@MockBean
Pour réaliser une simulation par simulation, si notre test doit être écrit dans la base de données, cela peut provoquer des opérations irréversibles
Nous utiliserons des simulations pour simuler ces opérations dangereuses
Regardons le code suivant
@SpringBootTest //能够初始化springboot的上下文,防止new Serv01 的对象同时依赖其他的Bean
public class Test2 {
@MockBean
Serv01 serv01;
@Test
void t1(){
int add = serv01.add(1, 1);
Assertions.assertEquals(2,add);
System.out.println(11);
}
}
Grâce au point d'arrêt, la variable add est en fait égale à 0
La raison est que le bean de notre serv01 dans le contexte SpringBoot a été remplacé par notre mock, car notre mock n'a pas d'opérations spécifiées, donc notre variable int add n'aura qu'une valeur par défaut de 0
Nous ajoutons quelques opérations spécifiées au simulacre
@SpringBootTest
public class Test2 {
@MockBean
Serv01 serv01;
@Test
void t1(){
when(serv01.add(1,1)).thenReturn(3);
int add = serv01.add(1, 1);
Assertions.assertEquals(2,add);
System.out.println(11);
}
}
Nous modifions à nouveau le code, ajoutons la sous-méthode à Serv01, puis exécutons le test
Nous pouvons trouver que dans la méthode add que nous spécifions la règle, le résultat est 3, tandis que la sous-méthode qui ne spécifie pas la règle utilise par défaut la variable int comme 0
Si nous voulons que les sous-marins soient testés de la manière originale et que nous ne voulons pas être affectés par @MockBean, nous pouvons utiliser @SpyBean
@SpyBean
Il se situe entre @MockBean et @Autowired. Lorsque la méthode est configurée, elle sera exécutée selon la règle de configuration, et le test sera exécuté selon la méthode d'origine s'il n'y a pas de configuration.
Si nous créons un serv02 et laissons serv01 appeler la méthode de serv02, le résultat de l'opération sera-t-il toujours le même?
@Service
public class Serv02 {
int add2(int a, int b){
return a+b;
}
}
@Service
public class Serv01 {
@Autowired
Serv02 serv02;
public int add(int a,int b){
return serv02.add2(a,b);
}
public int sub(int a,int b){
return a-b;
}
}
@SpringBootTest //能够初始化springboot的上下文,防止new Serv01 的对象同时依赖其他的Bean
public class Test2 {
@SpyBean
Serv01 serv01;
@MockBean
Serv02 serv02;
@Test
void t1(){
when(serv01.add(1,1)).thenReturn(3);
int add = serv01.add(1, 1);
int sub = serv01.sub(2,1);
Assertions.assertEquals(3,add);
Assertions.assertEquals(1,sub);
System.out.println(11);
}
}
L'opération est réussie, même si nous simulons serv02, appelons la méthode add2 de serv02 via la méthode add appelée par serv01, l'opération est toujours réussie!
Enfin, selon la spécification du test, nous correspondons généralement à un test pour une classe, mais il peut également y avoir plusieurs tests pour une classe, car il peut y avoir des cas où le test appelle plusieurs classes!