2013-10-02 2 views
6

mam tej klasy:status Oczekuje: <200> ale było: <404> w teście wiosennej

package controllers; 

    import static org.junit.Assert.*; 
    import static org.mockito.Mockito.mock; 
    import static org.mockito.Mockito.times; 
    import static org.mockito.Mockito.verify; 
    import static org.mockito.Mockito.when; 

    import java.util.HashSet; 

    import org.junit.Before; 
    import org.junit.Test; 
    import org.junit.runner.RunWith; 
    import org.mockito.InjectMocks; 
    import org.mockito.Mock; 
    import org.mockito.MockitoAnnotations; 
    import org.springframework.beans.factory.annotation.Autowired; 
    import org.springframework.test.context.ContextConfiguration; 


    import org.springframework.ui.Model; 
    import org.springframework.web.context.WebApplicationContext; 

    import com.epam.hhsystem.model.candidate.Candidate; 
    import com.epam.hhsystem.services.CandidateService; 
    import com.epam.hhsystem.web.controllers.CandidateMenuController; 
    import org.springframework.test.context.web.WebAppConfiguration; 
    import org.springframework.test.context.junit4.*; 
    import org.springframework.test.web.servlet.MockMvc; 
    import org.springframework.test.web.servlet.ResultActions; 
    import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; 
    import org.springframework.test.web.servlet.setup.MockMvcBuilders; 


    import org.springframework.test.web.servlet.request.*; 

    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; 
    import static org.hamcrest.Matchers.*; 
    import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; 
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; 


    @ContextConfiguration(locations = { "classpath:/test/BeanConfig.xml" }) 
    @RunWith(SpringJUnit4ClassRunner.class) 
    @WebAppConfiguration 
    public class CandidateControllerTest { 

     @Mock(name = "candidateService") 
     private CandidateService candidateService; 

     @InjectMocks 
     private CandidateMenuController candidateMenuController = new CandidateMenuController(); 

     @Autowired 
     WebApplicationContext wac; 

     MockMvc mockMvc; 

     @Before 
     public void before() { 
      MockitoAnnotations.initMocks(this); 
       this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).dispatchOptions(true).build(); 

     } 
@Test 
    public void testgoToCandidateMenuMockMvc() throws Exception { 
     //MockHttpServletRequestBuilder request = MockMvcRequestBuilders.get("/goToCandidateMenu"); 


     MockHttpServletRequestBuilder request = MockMvcRequestBuilders.get("/goToCandidateMenu"); 
     ResultActions result = mockMvc.perform(request); 
     result.andExpect(status().isOk()); 
    } 
} 

Kiedy wykonać go widzę:

kod
java.lang.AssertionError: Status expected:<200> but was:<404> 
at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:60) 
at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:89) 
at org.springframework.test.web.servlet.result.StatusResultMatchers$5.match(StatusResultMatchers.java:549) 
at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:141) 
at controllers.CandidateControllerTest.testgoToCandidateMenuMockMvc(CandidateControllerTest.java:104) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) 
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83) 
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

Kontroler:

@Controller 
public class CandidateMenuController extends AbstractController { 
... 
@RequestMapping("/goToCandidateMenu") 
    public String goToCandidateMenu() { 
     return "candidateMenu"; 
    } 
... 
} 

Czy możesz mi pomóc rozwiązać mój problem?

UPDATE

BeanConfig.xml:

<?xml version="1.0" encoding="UTF-8"?> 
    <beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang" 
     xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:util="http://www.springframework.org/schema/util" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd 
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
      http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd 
      http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd 
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
      http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> 

     <!-- Включаем опцию использования конфигурационных аннотаций (@Annotation-based configuration)--> 
     <context:annotation-config /> 


     <context:component-scan base-package="com.epam.hhsystem.jpa" /> 
     <context:component-scan base-package="com.epam.hhsystem.services" /> 

     <!-- Файл с настройками ресурсов для работы с данными (Data Access Resources) --> 
     <import resource="data.xml" /> 

    </beans> 

data.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang" 
    xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd 
     http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd 
     http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> 

<!-- Настраивает управление транзакциями с помощью аннотации @Transactional --> 
    <tx:annotation-driven transaction-manager="transactionManager" /> 

    <!-- Менеджер транзакций --> 
    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

    <!-- Непосредственно бин dataSource --> 
    <bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource" 
     p:driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" 
     p:url="jdbc:sqlserver://10.16.9.52:1433;databaseName=hhsystemTest;" 
     p:username="userNew" 
     p:password="Pass12345" /> 

    <!-- Настройки фабрики сессий Хибернейта --> 
    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="configLocation"> 
      <value>classpath:test/hibernate.cfg.xml</value> 
     </property> 

     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop> 
       <prop key="hibernate.connection.charSet">UTF-8</prop> 
<!--    <prop key="hibernate.hbm2ddl.auto">create-drop</prop> --> 
     </props> 
     </property> 
    </bean> 

</beans> 
+0

Będziemy potrzebować, aby zobaczyć swój kontekst. Ponadto, gdzie zainicjujesz 'mockMvc'? –

+0

Sprawdź wyniki logu. Jeśli otrzymujesz 404, serwer zazwyczaj powie ci, dlaczego. – chrylis

+10

dlaczego ktoś mógłby zgodzić się na takie uzasadnione pytanie IMHO? –

Odpowiedz

5

Twoja konfiguracja testu jest nie tak, że nie są inicjowanie MockMvc poprawnie i że to inni wyraźnie w przewodniku referencyjnym. Pierwszy z wszystkich masz dwa razy kod inicjujący i nie jesteś przyzwyczajony do wyniku połączenia z metodą build. Więc w zasadzie pozostaje ci pusty obiekt MockMvc.

@Before 
public void before() { 
    MockitoAnnotations.initMocks(this); 
    MockMvcBuilders.webAppContextSetup(this.wac).dispatchOptions(true).build(); 
    MockMvcBuilders.webAppContextSetup(this.wac).dispatchOptions(true).build(); 
} 

Powinny być

@Before 
public void before() { 
    MockitoAnnotations.initMocks(this); 
    this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).dispatchOptions(true).build(); 
} 

Jak stwierdzono to wszystko jest wyjaśnione w the reference guide.

+0

Przepraszamy, napisałem zły kod. (Komentarze). Mój kod jest jak wasz wariant. Ale mam stary problem. Naprawiłem musztarda w moim poście – gstackoverflow

+0

Poza tym w moim przypadku brakowało przedniego ukośnika "/" na początku adresu URL –

3

Po prostu nie włączyłem <mvc:annotation-driven> w twoim , więc twoje klasy @Controller po prostu nie są rejestrowane.

Dodaj ten

<mvc:annotation-driven></mvc:annotation-driven> 
1

dodałem ten adnotacji do klasy konfiguracji i pracy to:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(loader = AnnotationConfigWebContextLoader.class) 
@WebAppConfiguration 
public class ResourceTest { 

    ... 

    @Configuration 
    @EnableWebMvc 
    @ComponentScan(basePackages = { "..." }) 
    static class ContextConfiguration { 
    } 
}