2011-08-10 17 views
5

Tengo una aplicación web Spring y quiero hacer pruebas unitarias para mis controladores. Decidí no usar Spring para configurar mis pruebas, sino usar los objetos simulados de Mockito junto con mis controladores.Mockito Testcase ignora las anotaciones

Creo y ejecuto pruebas con Maven2 y el plugin surefire. Esto es de mi pom.xml configuración

 <!-- Test --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-test</artifactId> 
      <version>${spring.framework.version}</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.junit</groupId> 
      <artifactId>com.springsource.org.junit</artifactId> 
      <version>4.5.0</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.mockito</groupId> 
      <artifactId>mockito-all</artifactId> 
      <version>1.9.0-rc1</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

que mi compilador y plugins de éxito seguro como esto:

<build> 
    <pluginManagement> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <configuration> 
        <verbose>true</verbose> 
        <compilerVersion>1.6</compilerVersion> 
        <source>1.6</source> 
        <target>1.6</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <version>2.4.3</version> 
      </plugin> 

Mi clase de prueba es el siguiente:

@RunWith(MockitoJUnitRunner.class) 
public class EntityControllerTest { 

private EntityController entityController; 

private DataEntityType dataEntityType = new DataEntityTypeImpl("TestType"); 

@Mock 
private HttpServletRequest httpServletRequest; 

@Mock 
private EntityFacade entityFacade; 

@Mock 
private DataEntityTypeFacade dataEntityTypeFacade; 

@Before 
public void setUp() { 
    entityController = new EntityController(dataEntityTypeFacade, entityFacade); 
} 

@Test 
public void testGetEntityById_IllegalEntityTypeName() { 
    String wrong = "WROOONG!!"; 
    when(dataEntityTypeFacade.getEntityTypeFromTypeName(wrong)).thenReturn(null); 
    ModelAndView mav = entityController.getEntityById(wrong, httpServletRequest); 
    assertEquals("Wrong view returned in case of error", ".error", mav.getViewName()); 
} 

Anotaciones todo: -)

Pero al construir desde la línea de comandos obtengo una NullPointerException en la línea cuando (dataEntityTypeF) acade.getEntityTypeFromTypeName (wrong)). thenReturn (null); como el objeto dataEntityTypeFacade es nulo. Cuando ejecuto mi testcase en Eclipse todo está bien y mis objetos simulados son instanciados y se llama al método anotado con @Before.

¿Por qué mis anotaciones aparentemente se ignoran cuando se ejecuta desde la línea de comando ???

/Eva

+0

Por "edificio desde la línea de comandos", lo que quiere decir un experto construir o algo más? –

Respuesta

5

¿Ha llamado:

MockitoAnnotations.initMocks(testClass); 

en la clase base o un corredor de prueba como se menciona aquí: http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#9

+1

Olvidé publicar esto en la pregunta: Tengo @RunWith (MockitoJUnitRunner.class) sobre la definición de mi clase de prueba. De la forma en que lo entiendo, no debería tener que llamar a initMocs. –

+0

Sí, pero esta fue la única forma en que funciona para nosotros. –

+0

Leo el documento y parece que NECESITA la línea initMocks() para que funcione; está en negrita "¡Importante!" sección. Dice que "puede" usar el Runner con él; No estoy seguro de cuál es la diferencia con o sin el corredor. Pero seguramente necesitas esta línea. IMO: las anotaciones @Mock no son tan buenas como configurar los simulacros manualmente. –

Cuestiones relacionadas