2011-08-10 20 views
5

Mam aplikację internetową wiosenną i chcę zrobić unittests dla moich kontrolerów. Zdecydowałem się nie używać Springa do ustawienia moich testów, ale do używania mockito obiektów w połączeniu z moimi kontrolerami.Test testowy Mockito ignoruje adnotacje.

Buduję i przeprowadzam testy z Maven2 i wtyczką surefire. To z mojego pom.xml konfiguracji

 <!-- 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> 

I mój kompilator i murowany wtyczek tak:

<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> 

Moja klasa Test wygląda następująco:

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

adnotacje dookoła: -)

Ale podczas budowania z wiersza poleceń otrzymuję wyjątek NullPointerException w linii, gdy (dataEntityTypeF acade.getEntityTypeFromTypeName (wrong)). thenReturn (null); ponieważ obiekt dataEntityTypeFacade ma wartość NULL. Kiedy uruchamiam swój test testowy w Eclipse, wszystko jest w porządku, a moje fałszywe obiekty są tworzone, a metoda opisana przy pomocy @Before jest wywoływana.

Dlaczego moje adnotacje są pozornie ignorowane podczas uruchamiania z wiersza poleceń?

/Eva

+0

Przez "budynku z poleceń", czy oznacza Maven budować czy coś innego? –

Odpowiedz

5

Czy nazywa się:

MockitoAnnotations.initMocks(testClass); 

w klasie bazowej lub biegacza testowej jak tu wymienić: http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#9

+1

Zapomniałem napisać to w pytaniu: Mam @RunWith (MockitoJUnitRunner.class) powyżej mojej definicji klasy testowej. Sposób, w jaki to rozumiem, nie powinien wywoływać initMocs. –

+0

Tak, ale to był jedyny sposób, w jaki działa dla nas. –

+0

Przeczytałem dokument i brzmi to tak, jak POTRZEBUJESZ linii initMocks(), aby działała; jest pogrubiony "Ważne!" Sekcja. Mówi, że "możesz" użyć Runner; Nie jestem pewien, jaka jest różnica z Runnerem lub bez niego. Ale na pewno potrzebujesz tej linii. IMO - Adnotacje @Mock nie są tak dobre, jak ręczne ustawianie mocks. –