Springboot intègre les annotations communes Junit5

@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 Initializrlorsque 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);

    }
}

[Échec du transfert de l'image du lien externe. Le site source dispose peut-être d'un mécanisme de liaison anti-sangsue. Il est recommandé d'enregistrer l'image et de la télécharger directement (img-E0fAxy1F-1614608984966) (SpringBoot.assets / image-20210301211956830.png)]

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);

    }
}

[Échec du transfert de l'image du lien externe. Le site d'origine dispose peut-être d'un mécanisme de liaison anti-sangsue. Il est recommandé d'enregistrer l'image et de la télécharger directement (img-qFa2e1lm-1614608984968) (SpringBoot.assets / image-20210301212408593.png)]

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!

Je suppose que tu aimes

Origine blog.csdn.net/weixin_46195957/article/details/114273530
conseillé
Classement