Prueba unitaria de Springboot práctica de clase dependiente simulada

Importar paquete, versión de prueba: <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>

Clase de prueba

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

}

Adjunto a los problemas encontrados:

Pregunta uno: método de vacío simulado, método sin valor de retorno

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

Pregunta 2: mensaje de error

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

Solución: Por ejemplo, el incorrecto se escribe así:

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

Modifique los parámetros entrantes, hay un parámetro any, de los cuales los parámetros non-any se agregan con eq () , como "xiaoming", este es un parámetro determinado, no cualquiera que esté unificado con algunos tipos

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

Generalmente, no es necesario agregar eq (), pero si hay un parámetro que necesita agregarse, otros parámetros también deberían ver si es necesario agregar eq ().

Pregunta 3: Variables globales de clase simulada

Introducir pom

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

Instrucciones

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

Esto es un simulacro, la variable mockJzt de la clase aService se establece en 1.

Pregunta 4: Llame a varios métodos en el método de prueba, simule algunos de ellos y use la llamada real para el resto de la llamada sin simulacro

Por ejemplo, para probar el método findStudent de la clase A, los tres métodos a, byc de la clase B se llaman en el método findStudent, los métodos ayb se burlan y el método real de c se llama

cuando (Ba ("")). thenReturn (falso); 
cuando (Ba ("")). thenReturn (falso); 
cuando (Bc ("")). thenReturn (Bc ());

El punto clave es entoncesReturn Después de esto, si el simulacro puede devolver los datos de su propio simulacro, si no simula, puede llamar al método real y devolver el valor real . (Es necesario presentar el uso de inyección de clase @Autowire)

 

Supongo que te gusta

Origin blog.csdn.net/Mint6/article/details/93490063
Recomendado
Clasificación