Test unitaire Springboot Pratique de classe dépendante simulée

Package d'importation, version de test: <powermock.version> 1.7.1 </powermock.version>

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito2</artifactId>
    <version>${powermock.version}</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>${powermock.version}</version>
    <scope>test</scope>
</dependency>

Classe d'essai

//aService类的findStudyInfoById方法内部实现,调用了bDao的方法,
//单元测试只需关心aService当前层的正确性,bDao的正确性由它自己的单元测试保证,
//所以需要模拟一个假的bDao场景,来配合完成aService的单元测试
public class MockTest {

    //注入要测试类,注意这里注入写实现类,不能写接口注入
    @InjectMocks
    private AServiceImpl aService;

    //mock这个类,帮助测试aService,而不测试实际的bDao
    @Mock
    private BDao bDao;

    //初始化测试数据
    @Before
    public void initMock() {
        MockitoAnnotations.initMocks(this);
        Student student = new Student;
        student.setName("测试");
        student.setId(1);
        //初始化mock类的场景,如果传入一个int,返回自己mock的student数据
        when(bDao.findStudyInfoById(anyInt())).thenReturn(student);
    }

    @Test
    public void findStudyInfoById() throws Exception {
        List<Student> students = aService.findStudyInfoById(1);
        Assert.assertTrue(rstudents.size()==1);
    }

}

Attaché aux problèmes rencontrés:

Première question: méthode mock void, méthode sans valeur de retour

AService aService = Mockito.mock(AService.class);
        Mockito.doAnswer(new Answer<Object>() {
            public Object answer(InvocationOnMock invocation) {
                Object[] args = invocation.getArguments();
                return "执行了" + args;
            }
        }).when(aService).findStudent(anyString());

Question 2: Invite d'erreur

This exception may occur if matchers are combined with raw values:
    //incorrect:
    someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
    //correct:
    someMethod(anyObject(), eq("String by matcher"));

Solution: Par exemple, le mauvais est écrit comme ceci:

when(aService.findStudent("xiaoming",anyList()));

Modifiez les paramètres entrants, il y a un paramètre any, dont tous les paramètres non-any sont ajoutés avec eq () , comme "xiaoming", c'est un certain paramètre, pas n'importe lequel qui est unifié avec certains types

when(aService.findStudent(eq("xiaoming"),eq(anyList())));

En général, il n'est pas nécessaire d'ajouter eq (), mais s'il y a un paramètre à ajouter, d'autres paramètres devraient également voir si eq () doit être ajouté.

Question 3: Variables globales de classe fictive

Introduire pom

 <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-reflect</artifactId>
            <version>1.7.1</version>
            <scope>test</scope>
        </dependency>

Instructions

Whitebox.setInternalState(aService, "mockJzt",1);

Ceci est une simulation, la variable mockJzt de la classe aService est définie sur 1.

Question 4: Appelez plusieurs méthodes dans la méthode de test, simulez certaines d'entre elles et utilisez l'appel réel pour le reste de l'appel sans simuler

Par exemple, pour tester la méthode findStudent de classe A, les trois méthodes a, b et c de classe B sont appelées dans la méthode findStudent, les méthodes a et b sont simulées et la méthode réelle de c est appelée

quand (Ba ("")). thenReturn (false); 
quand (Ba ("")). thenReturn (false); 
quand (Bc ("")). thenReturn (Bc ());

Le point clé est thenReturn . Après cela, si la maquette peut renvoyer les données de sa propre maquette, si elle ne se moque pas, elle peut appeler la méthode réelle et renvoyer la valeur réelle . (Besoin d'introduire l'utilisation de l'injection de classe @Autowire)

 

Je suppose que tu aimes

Origine blog.csdn.net/Mint6/article/details/93490063
conseillé
Classement