Status expected:<200> but was:<404> in spring test

52,443

Solution 1

Your test setup is wrong you aren't initializing the MockMvc correctly and that is al clearly in the reference guide. FIrst of all you have twice the initializing code and you aren't assing the result of the call to the build method. So you are basically left with an empty MockMvc object.

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

Should be

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

As stated this is all explained in the reference guide.

Solution 2

In my case, I was missing the below annotation and was getting this error.

@WebMvcTest(UserStatsController.class)
public class UserStatsControllerTest {
  ..
}

Note that the class of the controller and NOT the test. Make sure as well if you load other class using @ContextConfiguration(NOT the test) not load test class.

Solution 3

I believe you just haven't enabled <mvc:annotation-driven> in your beanconfig.xml and so your @Controller classes just aren't being registered.

Add this

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

Solution 4

This is my working solution. Hope it helps.

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@WebAppConfiguration
public class SimpleTest  {

private MockMvc mockMvc;

@Autowired
private WebApplicationContext webApplicationContext;

@Before
public void setup() throws Exception {
    mockMvc = webAppContextSetup(webApplicationContext)
            .build();
    }

@Test
public void test() throws Exception {        
    mockMvc.perform(get("/simple")
            .contentType(MediaType.APPLICATION_JSON))
            .andExpect(status().is(200));
    }
}

Solution 5

My problem was I did not have @ComponentScan() it was pretty embarrassing. It was also hard to find.I,myself overlooked my SpringBootApplication.

Share:
52,443

Related videos on Youtube

gstackoverflow
Author by

gstackoverflow

Updated on September 08, 2020

Comments

  • gstackoverflow
    gstackoverflow over 3 years

    I have this class:

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

    When I execute it I see:

    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)
    

    Controller code:

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

    Can you help me to fix my 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>
    
    • Sotirios Delimanolis
      Sotirios Delimanolis over 10 years
      We'll need to see your context. Also, where do you initialize mockMvc?
    • chrylis -cautiouslyoptimistic-
      chrylis -cautiouslyoptimistic- over 10 years
      Look at log output. If you're getting a 404, the server will usually tell you why.
    • Stefan Haberl
      Stefan Haberl over 10 years
      why would someone downvote an IMHO legitimate question like this?
    • Sotirios Delimanolis
      Sotirios Delimanolis over 10 years
      @StefanHaberl I downvoted because the question does not show any research effort. It a simple dump of a problem.
    • gstackoverflow
      gstackoverflow over 10 years
      I made a mistake when I posted my topic. please read.
    • M. Deinum
      M. Deinum over 10 years
      Post your configuration.
    • gstackoverflow
      gstackoverflow over 10 years
      I must to post web.xml?
    • gstackoverflow
      gstackoverflow over 10 years
      i am added configuration to topic
    • gstackoverflow
      gstackoverflow over 10 years
      M. Deinum, Do you have not ideas?
    • Stefan Haberl
      Stefan Haberl over 10 years
      @SotiriosDelimanolis Still, I don't get it. What about questions like stackoverflow.com/questions/596351/… They don't show ANY kind of research and get an upvote of +600! Stackoverflow feels more and more hostile to me because of these downvotes!
    • Sotirios Delimanolis
      Sotirios Delimanolis over 10 years
      @StefanHaberl That question applies to a very wide audience. This question applies only to OP. That doesn't mean we won't answer it.
    • Enrico Giurin
      Enrico Giurin about 6 years
      If I were you I'd remove the name of the company you work for in the import section ;-)
    • gstackoverflow
      gstackoverflow about 6 years
      @Enrico Giurin it was not commercial project. It was some sort of educational project.
    • Jeremy Grand
      Jeremy Grand almost 4 years
      @StefanHaberl Because Stackoverflow is not a forum where people help you code, it is a knowledge base where people can post common issues so that their resolution may be reused. The question you linked is basically 'I don't know a very basic feature', thus this Q&A becomes a google-indexed documentation page. This question is 'I screwed up my integration test, please review my entire project and tell me where I'm wrong' => absolutely 0 reusability.
    • Jeremy Grand
      Jeremy Grand almost 4 years
      @StefanHaberl When we say 'research effort' it does not mean that we judged the user 'not worthy' of an error, it means that the user did not follow the guideline to post a 'minimal reusable question'. It's even worse because the user got several tests red and posted several question for every failing test. If someone has trouble with setting up a MockMvcServer, they should post a minimal question explaining what they've done to set it up and explain the result rather than asking to people to fix specific tests.
    • Stefan Haberl
      Stefan Haberl almost 4 years
      7 years later and I still disagree. K, this is no great question, BUT the OP gets downvoted for a real problem he has (I don’t judge his problem solving capabilities here). And the very basic jQuery question I linked has now 2500+ upvotes. SO still rewards the silliest, most rudimentary questions most. Which I still believe is wrong.
  • gstackoverflow
    gstackoverflow over 10 years
    Sorry, I posted wrong code.(posted comments). My code is like your variant. But I have old problem. I fixed mustake in my post
  • Pedro Madrid
    Pedro Madrid about 8 years
    Besides this, in my case I was missing a forward slash "/" at the beginning of the url
  • Raymond Chen
    Raymond Chen over 4 years
    There are 6 annotations appear here, which one did you add?
  • Schiman
    Schiman over 4 years
    All you see on ContextConfiguration and @ContextConfiguration(loader = AnnotationConfigWebContextLoader.class)
  • jumping_monkey
    jumping_monkey over 4 years
    Thanks mate, simple but helpful answer! I was using UserStatsControllerTest.class, hahaha :(