Status expected:<200> but was:<404> in spring test
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.
Related videos on Youtube
gstackoverflow
Updated on September 08, 2020Comments
-
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 over 10 yearsWe'll need to see your context. Also, where do you initialize
mockMvc
? -
chrylis -cautiouslyoptimistic- over 10 yearsLook at log output. If you're getting a 404, the server will usually tell you why.
-
Stefan Haberl over 10 yearswhy would someone downvote an IMHO legitimate question like this?
-
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 over 10 yearsI made a mistake when I posted my topic. please read.
-
M. Deinum over 10 yearsPost your configuration.
-
gstackoverflow over 10 yearsI must to post web.xml?
-
gstackoverflow over 10 yearsi am added configuration to topic
-
gstackoverflow over 10 yearsM. Deinum, Do you have not ideas?
-
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 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 about 6 yearsIf I were you I'd remove the name of the company you work for in the import section ;-)
-
gstackoverflow about 6 years@Enrico Giurin it was not commercial project. It was some sort of educational project.
-
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 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 almost 4 years7 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 over 10 yearsSorry, 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 about 8 yearsBesides this, in my case I was missing a forward slash "/" at the beginning of the url
-
Raymond Chen over 4 yearsThere are 6 annotations appear here, which one did you add?
-
Schiman over 4 yearsAll you see on ContextConfiguration and @ContextConfiguration(loader = AnnotationConfigWebContextLoader.class)
-
jumping_monkey over 4 yearsThanks mate, simple but helpful answer! I was using UserStatsControllerTest.class, hahaha :(