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.

Junit establece una variable local.

Estoy utilizando un archivo jar adicional en mi proyecto spring boot. El problema es que uno de los métodos que quiero probar está utilizando un método de ese jar que devuelve un valor, pero también establece un valor en una variable que se le pasa.

String valueThatWillBeReturned;
int returnMessage = method(valueThatWillBeReturned);

No sé por qué el método está escrito de esa manera. No soy el autor del jar y no puedo depurarlo, pero funciona así. Devolverá un int que se almacenará en int returnMessage, y también establecerá valueThatWillBeReturned que se le pasa.
Es un problema para mí probarlo. Estoy estableciendo el valor de int returnMessage por:

when(external.method(valueThatWillBeReturned).thenReturn(1);

Pero ¿cómo debería establecer el valor de String valueThatWillBeReturned?
El problema principal es que mi código depende de String valueThatWillBeReturned que debe ser devuelto.

Después de la edición:

He simplificado el ejemplo anterior, pero le daré detalles adicionales. Estoy utilizando una biblioteca externa ImageSDK.jar. Utiliza archivos .dll o .so dependiendo del sistema operativo.

Entonces, según la documentación, debería tener int[] pnMatchTemplate2Index = new int[1] para pasar al siguiente método.

int result = libSDK.UFM_Identify(hMatcherContainer[0],
templateForIdentification,
sizeOfTemplateForIdentification,
templatesFromDBForIdentification,
sizeOfEachTemplateFromDB,
numberOfTemplatesForCompare,
5000,
pnMatchTemplate2Index);

Lo que el método devuelve es un int result que almacena el estado de retorno, pero el método también establece pnMatchTemplate2Index donde se almacena el índice de la plantilla coincidente. Después, estoy usando templates.get(pnMatchTemplate2Index[0]) para obtener la información que necesito.

Entonces, al final, mi método depende de ese parámetro para devolver un valor, y no sé cómo establecerlo mediante Junit para probar el retorno de mi método.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Al probar este método, puede utilizar Mockito para simular el comportamiento de la función externa que establece el valorQueSeRetornará. Aquí hay un ejemplo de cómo hacerlo:

    En primer lugar, cree un objeto simulado para la función externa:

    ExternalClass externalMock = mock(ExternalClass.class);
    

    Luego, defina el comportamiento del método usando doAnswer() y Answer:

    doAnswer(new Answer() {
      public Object answer(InvocationOnMock invocation) {
        String value = "foo"; // establezca cualquier valor que desee devolver
        Object[] args = invocation.getArguments();
        ((String[])args[0])[0] = value; // establezca el valor en el primer elemento del argumento de matriz de cadena
        return 1; // devuelva el valor int
      }
    }).when(externalMock.method(any(String[].class)));
    

    Esto establecerá el valorQueSeRetornará a “foo” y devolverá 1 cuando se llame a external.method().

    Luego, en su método de prueba, puede pasar una matriz de String con un elemento (inicialmente null) y comprobar que el valor se ha establecido en “foo”:

    @Test
    public void testMethod() {
      String[] value = new String[1];
      int returnMessage = yourClass.method(value);
    
      assertEquals("foo", value[0]); // compruebe que el valor se ha establecido en "foo"
      assertEquals(1, returnMessage); // compruebe que el valor de retorno es 1
    }
    

    Tenga en cuenta que necesita pasar una matriz de String como argumento a external.method(), y establecer el valor en el primer elemento de la matriz. Esto se debe a que el método espera una matriz que pueda modificar en su lugar.

Comments are closed.