2013-10-02 3 views
6

Ich habe diese Klasse:Des Status erwartet: <200> aber war: <404> im Frühjahr Test

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

Wenn ich es ausführen ich sehe:

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) 

Code Controller:

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

Können Sie mir helfen, mein Problem zu beheben?

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

Wir werden Ihren Kontext sehen müssen. Wo initialisierst du 'mockMvc'? –

+0

Sehen Sie sich die Protokollausgabe an. Wenn Sie einen 404 erhalten, sagt Ihnen der Server normalerweise, warum. – chrylis

+10

Warum würde jemand eine IMHO legitime Frage wie folgt ablehnen? –

Antwort

5

Ihr Test-Setup ist falsch Sie nicht die MockMvc richtig initialisiert wird, und das ist al klar im Referenzhandbuch. Zunächst einmal haben Sie zweimal den Initialisierungscode und Sie verwenden das Ergebnis des Aufrufs der build-Methode nicht. Sie haben also grundsätzlich ein leeres MockMvc Objekt übrig.

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

Sollte

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

sein, wie gesagt das alles in the reference guide erklärt.

+0

Entschuldigung, ich habe falschen Code gepostet. (Gepostete Kommentare). Mein Code ist wie deine Variante. Aber ich habe altes Problem. Ich habe das Problem in meinem Beitrag behoben. – gstackoverflow

+0

Außerdem fehlte in meinem Fall ein Schrägstrich "/" am Anfang der URL –

3

Ich glaube, Sie haben <mvc:annotation-driven> in Ihrem gerade nicht aktiviert und so Ihre @Controller Klassen werden gerade nicht registriert.

Fügen Sie diese

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

ich diese Anmerkung zu Konfigurationsklasse hinzugefügt und es funktioniert:

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

    ... 

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