es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo verificar las llamadas de método en la cláusula “where” de una prueba Spock para un método recursivo.

Digamos que mi clase se llama Foo con un método recursivo bar que llama a un servicio como se muestra a continuación

public class Foo
{
    private DataService service;

    public void perform(int count, final SomeObject obj)
    {
        if(count > 0)
        {
            service.refresh(obj);
            count = count- 1;
            perform(count, obj)
        }
    }
}

Ahora quiero verificar la cantidad de veces que se llama al método refresh para diferentes entradas, algo así

@Test
def "test method"()
{
given:
def obj = Mock(SomeObject)

expect:
foo.perform(refreshRequests, inputObj)

where:
refreshRequests | inputObj | 
1               | obj      | 1 * service.refresh(obj)
2               | obj      | 2 * service.refresh(obj)
}

¿Existe alguna forma de lograr algo como esto?
¡Gracias de antemano!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, definitivamente es posible verificar el número de veces que se llama al método refresh para diferentes entradas en Groovy y Spock.

    En primer lugar, necesitas usar el método Mock() para crear un objeto de simulación para la clase DataService, que reemplazará al objeto de servicio real en la clase Foo durante las pruebas.

    Luego, puedes usar el método verify() del módulo de pruebas basado en interacciones de Spock para verificar el número de veces que se llama al método refresh con un parámetro específico.

    Aquí tienes un ejemplo de código de prueba que demuestra cómo lograr esto:

    import spock.lang.*
    
    class FooTest extends Specification {
    
        def "test perform method"() {
            given:
            def service = Mock(DataService)
            def foo = new Foo(service: service)
            def obj = Mock(SomeObject)
    
            when:
            foo.perform(refreshRequests, obj)
    
            then:
            refreshRequests.times { service.refresh(obj) }
    
            where:
            refreshRequests | _
            1               |
            2               |
            // agregar más casos de prueba aquí
        }
    }
    

    En este ejemplo, creamos un objeto de simulación para la clase DataService y lo pasamos al constructor de Foo utilizando la sintaxis de argumento nombrado. También creamos un objeto de simulación para la clase SomeObject.

    En el bloque when, llamamos al método perform() del objeto foo con diferentes valores de refreshRequests e inputObj.

    En el bloque then, usamos el método times() para verificar el número de veces que se llama al método refresh() con el parámetro obj. El método times() toma un cierre que contiene la llamada al método a verificar y el número de veces que debe ser llamado.

    En el bloque where, definimos diferentes casos de prueba con diferentes valores de refreshRequests.

    Espero que esto te ayude. Hazme saber si tienes alguna otra pregunta.

Comments are closed.