2010-11-14 20 views
7

Me encontré con un problema con mockito. Estoy desarrollando una aplicación web. En mis pruebas, se burla de la administración de usuarios. Hay algunos casos en los que tengo que modificar el usuario devuelto por el método getLoggedInUser().Método de réplica de Mockito ya anotado con thenthrow

El problema es que mi método getLoggedInUser() también arroja un AuthenticationException.

Así que cuando trato de cambiar de ningún usuario a algún usuario, la llamada a

when(userProvider.getLoggedInUser()).thenReturn(user); 

se produce una excepción, ya que userProvider.getLoggedInUser() ya se apagó con thenTrow()

¿Hay alguna manera de decirle al when método para no preocuparse por las excepciones?

Gracias de antemano - István

+0

¡Gracias a todos por las respuestas! En resumen: es probable que debido al diseño deficiente del software que necesito para restaurar el método. Pero por ahora es fácil para mí, y las pruebas también se ven limpias. Investigué un poco más y encontré el método Mockito.reset (T ... burla), que me parece el truco. La próxima vez me daré cuenta de un diseño más simple :) – Szobi

Respuesta

2

Mi primera reacción a su pregunta es que parece que está tratando de hacer demasiado en una prueba.

Para facilitar la prueba y la simplicidad, cada prueba debe probar una sola cosa. Esto es lo mismo que Single Responsibility Principle. A menudo encuentro que los programadores intentan probar varias cosas en una prueba y tienen todo tipo de problemas debido a eso. Así que cada uno de sus métodos de prueba de la unidad debe seguir este flujo:

  1. instalación de un único escenario de la prueba.
  2. Realice una llamada a la clase que se está probando para activar el código que se está probando.
  3. Verifica el comportamiento.

En su caso, esperaría ver al menos dos pruebas. Uno donde getLoggedInUser() devuelve un usuario, y otro donde getLoggedInUser() arroja una excepción. De esta forma, no tendrás problemas para simular un comportamiento diferente en el simulacro.

El segundo pensamiento que me viene a la mente es no resbalar. Considere el uso de esperar en su lugar porque puede configurar una serie de expectativas. Es decir. la primera llamada devuelve un usuario, la segunda llamada arroja una excepción, la tercera llamada devuelve un usuario diferente, etc.

+1

Un ejemplo de usar 'esperar' o un enlace a la documentación/tutoriales sería apreciado :) –

2

Parece que usted puede tener que utilizar una respuesta personalizada. Here is an example.

+0

Gracias javamonkey, esta es también una solución razonable, pero por ahora me quedaré con Mockito.reset(). – Szobi

+0

Interesante - Te daré el +1 en la pregunta en general por la información que acabo de aprender sobre el reinicio. Estoy seguro de que lo leíste también, así que no lo repetiré ... cosas buenas :) – javamonkey79

+0

Gracias por el +1 :) – Szobi

1

¿Hay alguna manera de decirle al método cuando no a la atención acerca de las excepciones?

Para responder a esta pregunta en realidad:

import static org.hamcrest.Matchers.equalTo; 
import static org.hamcrest.Matchers.is; 
import static org.junit.Assert.assertThat; 
import static org.mockito.ArgumentMatchers.any; 
import static org.powermock.api.mockito.PowerMockito.mock; 
import static org.powermock.api.mockito.PowerMockito.when; 

import org.junit.Test; 
import org.mockito.Mockito; 

import java.util.ArrayList; 

public class MyTest { 

    @Test 
    public void testA() { 

     // setup 
     ArrayList<Object> list = mock(ObjectArrayList.class); 
     when(list.indexOf(any())).thenReturn(6); 
     when(list.indexOf(any())).thenReturn(12); 

     // execute 
     int index = list.indexOf(new Object()); 

     // verify 
     assertThat(index, is(equalTo(12))); 
    } 

    @Test 
    public void testB() { 

     // setup 
     ArrayList<Object> list = mock(ObjectArrayList.class); 
     when(list.add(any())).thenThrow(new AssertionError("can't get rid of me!")); 
     when(list.add(any())).thenReturn(true); 

     // execute 
     list.add(new Object()); 
    } 

    @Test 
    public void testC() { 

     // setup 
     ArrayList<Object> list = mock(ObjectArrayList.class); 
     when(list.add(any())).thenThrow(new AssertionError("can't get rid of me!")); 
     Mockito.reset(list); 
     when(list.add(any())).thenReturn(true); 

     // execute 
     list.add(new Object()); 
    } 

    /** 
    * Exists to work around the fact that mocking an ArrayList<Object> 
    * requires a cast, which causes "unchecked" warnings, that can only be suppressed... 
    */ 
    class ObjectArrayList extends ArrayList<Object> { 

    } 
} 

TestB falla debido a la aserción de que no puede deshacerse de.TestC muestra cómo se puede utilizar el método reset para restablecer el simulacro y eliminar el comando thenThrow en él.

Tenga en cuenta que el reinicio no siempre parece funcionar en algunos ejemplos más complicados que tengo. Sospecho que podría ser porque están usando PowerMockito.mock en lugar de Mockito.mock?

Cuestiones relacionadas