This post will explain about, how to work with spring mvc ,Junit test case for Services,Mock test for controller with Json Object.
Step 1: Create a dynamic webproject in eclipse->i have created with name spring_junit
Step 2: Modify the web.xml
spring_junit
redirect.jsp
contextConfigLocation/WEB-INF/applicationContext.xml
org.springframework.web.context.ContextLoaderListener
dispatcher
org.springframework.web.servlet.DispatcherServlet
1
dispatcher
*.htm
Step 3: we need to create applicationContext.xml inside WEB-INF folder. This will have details related to database and other values. Here mentioned only DB details.
Step 4: Create dispatcher-servlet.xml(in web.xml we have mentioned servlet name as dispatcher, so in sping mvc xml configuration with name [servletname-servlet.xml].
So here we have to give name as dispatcher-servlet.xml
Step 5: Create a database schema name as employee and create a table called user with the columns - id,name,password,gender,country
Step 6: Configuration files has been created for spring-mvc . Now we need to write source code. First we will create controller class with name UserController under package - com.siva.controller
package com.siva.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;
import com.siva.domain.User;
import com.siva.service.UserService;
@Controller
@RequestMapping("/userRegistration.htm")
@SessionAttributes("user")
public class UserController {
private UserService userService;
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
@RequestMapping(method = RequestMethod.GET)
public String showUserForm(ModelMap model)
{
User user = new User();
model.addAttribute(user);
return "userForm";
}
@RequestMapping(method = RequestMethod.POST)
public String onSubmit(@ModelAttribute("user") User user) {
userService.add(user);
return "redirect:userSuccess.htm";
}
public UserService getUserService() {
return userService;
}
}
Step 7: Create domain class with name User under com.siva.domain package
package com.siva.domain;
public class User {
private int id;
private String name;
private String password;
private String gender;
private String country;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
Step 8: Create service and serviceImpl classes inside com.siva.service package.
package com.siva.service;
import com.siva.domain.User;
public interface UserService {
public void add(User user);
}
package com.siva.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.siva.dao.UserDAO;
import com.siva.domain.User;
@Repository("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDAO userDAO;
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
@Override
public void add(User user) {
//Persist the user object here.
userDAO.add(user);
System.out.println("User added successfully");
System.out.println("UserName["+user.getName()+"]");
System.out.println("Gender["+user.getGender()+"]");
System.out.println("Pasword["+user.getPassword()+"]");
System.out.println("Country["+user.getCountry()+"]");
}
public UserDAO getUserDAO() {
return userDAO;
}
}
Step 9: Create dao and daoImpl classes inside com.siva.dao package.
package com.siva.dao;
import com.siva.domain.User;
public interface UserDAO {
public void add(User user);
}
package com.siva.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import com.siva.domain.User;
@Repository("userDAO")
public class UserDAOImpl implements UserDAO {
@Autowired
public JdbcTemplate jdbcTemplate;
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
@Override
public void add(User user) {
//Persist the user object here.
String sql = "INSERT INTO USER(id,name,gender,password,country) VALUES(?, ?, ?,?,?)";
int returnValue = getJdbcTemplate().update(
sql,
new Object[] {user.getId(), user.getName(), user.getGender(),user.getPassword(),user.getCountry()});
if(1 == returnValue)
System.out.println("Record inserted successfully");
else{
System.out.println("Record inserted Failure");
}
}
}
Step 10: Java code has been completed. Now we need to write jsp files under /WEB-INF/jsp/userForm.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
Registration Page
Step 11: create one more jsp /WEB-INF/jsp/userSuccess.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
Success Page
User Details
User ID : ${user.id}
User Name : ${user.name}
Password : ${user.password}
Gender : ${user.gender}
Country : ${user.country}
Step 12 : We need to add the jar file under /WEB-INF/lib
antlr-runtime-3.0.jar
com.mysql.jdbc_5.1.5.jar
commons-logging-1.0.4.jar
hamcrest-core-1.2.jar
javax.json-1.0.jar
junit-4.11.jar
spring-aop-4.1.6.RELEASE.jar
spring-beans-4.1.6.RELEASE.jar
spring-context-4.1.6.RELEASE.jar
spring-core-4.1.6.RELEASE.jar
spring-expression-4.1.6.RELEASE.jar
spring-jdbc-4.1.6.RELEASE.jar
spring-orm-4.1.6.RELEASE.jar
spring-test-4.1.6.RELEASE.jar
spring-tx-4.1.6.RELEASE.jar
spring-web-4.1.6.RELEASE.jar
spring-webmvc-4.1.6.RELEASE.jar
Step 13: We can run this project by using any one of the server. I have used tomcat and input and output will be display like below.
use URL - http://localhost:8080/spring_junit/userRegistration.htm and provide input details like id, name etc..
Step 14: Now it's time to write junit test case for service. Here i have written simple test case , u can write more test cases depening upon your requirement.
Step 15: First Create a UserServiceAndControllerTest under package - com.siva.test
package com.siva.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import javax.sql.DataSource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockHttpSession;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import com.siva.domain.User;
import com.siva.service.UserService;
import com.siva.web.UserController;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=AppConfig.class)
public class UserServiceAndControllerTest {
private MockMvc mockMvc;
@Autowired
private UserService userService;
@Autowired
DataSource dataSource;
@Autowired
private UserController userController;
@Autowired
MockHttpSession mockHttpSession;
@Test
public void testUserService(){
assertEquals("class com.siva.service.UserServiceImpl", this.userService.getClass().toString());
}
@Test
public void testUserController(){
assertEquals("class com.siva.web.UserController", this.userController.getClass().toString());
}
@Test
public void testAdd() {
User user = new User();
user.setId(13);
user.setName("Varma");
user.setGender("Male");
user.setPassword("Varma 123");
user.setCountry("India");
userService.add(user);
assertTrue(true);
}
@Test
public void testOnSubmit(){
mockMvc= MockMvcBuilders.standaloneSetup(this.userController).build();
try {
/*User user = new User();
user.setName("siva1");
user.setGender("Male");
user.setPassword("Raju1");*/
mockHttpSession.setAttribute("user", new UserJSONReader().getUserJSOnObject());
mockMvc.perform(post("/userRegistration.htm").session(mockHttpSession).accept(MediaType.APPLICATION_JSON))
.andExpect(status().is3xxRedirection()).andExpect(redirectedUrl("userSuccess.htm"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
Step 16: In the above class we have 4 test methods first two are to check whether service and controller classes loaded successfully or not.
Other two are actual functionality for service and controller method test through spring mockmvc.
Step 17 : In the above class to test the controller method either passing user object values as hard coded or we can pass through json object.
I have passed here json object for this we need to create one json class to read the json file and conver it into user json object.
Step 18: create UserJSONReader.java under package com.siva.test
package com.siva.test;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;
import com.siva.domain.User;
public class UserJSONReader {
public User getUserJSOnObject(){
User user = new User();
try {
InputStream fis = new FileInputStream("user_json.txt");
//create JsonReader object
JsonReader jsonReader = Json.createReader(fis);
//get JsonObject from JsonReader
JsonObject jsonObject = jsonReader.readObject();
user.setId(jsonObject.getInt("id"));
user.setName(jsonObject.getString("name"));
user.setPassword(jsonObject.getString("password"));
user.setCountry(jsonObject.getString("country"));
user.setGender(jsonObject.getString("gender"));
jsonReader.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
return user;
}
}
Step 19: create user_json.txt file under project.
{
"id":14,
"name":"Jatin",
"password":"jatin 123",
"gender":"Male",
"country":"India is a Great Country"
}
Step 20: Now we need to create one xml file with name-UserServiceAndControllerTest-context.xml
Step 21: This is very important step for spring junit. need to configure bean details inside java class. Create class called AppConfig under package com.siva.test
package com.siva.test;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.mock.web.MockHttpSession;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.siva.dao.UserDAO;
import com.siva.dao.UserDAOImpl;
import com.siva.service.UserService;
import com.siva.service.UserServiceImpl;
import com.siva.web.UserController;
import com.siva.web.UserSuccessController;
@Configuration
public class AppConfig {
@Bean
public UserService getUserService(){
return new UserServiceImpl();
}
@Bean
public UserDAO getUserDAO(){
return new UserDAOImpl();
}
@Bean
public JdbcTemplate getJdbcTemplate() {
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(getDataSource());
return jdbcTemplate;
}
@Bean
public DataSource getDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
//MySQL database we are using
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/employee");//change url
dataSource.setUsername("root");//change userid
dataSource.setPassword("root");//change pwd
return dataSource;
}
@Bean
public UserController getUserController(){
return new UserController();
}
@Bean
public UserSuccessController getUserSuccessController(){
return new UserSuccessController();
}
@Bean
public MockHttpSession getMockHttpSession(){
return new MockHttpSession();
}
}
Step 21: Once everything is done , then we will run this Test program as Run AS Junit, it has to insert data successfully and test case execution should be passed.
Thank you very much for viewing this post.