spring


How to unit testing spring boot rest controller and exception handler using power mock


I am having a simple Spring boot application which contains Employee controller which returns the Employee names if the year passed is greater than 2014 and if the it is not less than 2014 then I am throwing a custom exception and handling it in Exception Handler. I want to unit test the exception flow using powermock but I am not sure how to do it. I have gone through some links but unable to understand.
Currently I am getting java.lang.IllegalArgumentException: WebApplicationContext is required.
EmployeeController.java
#RestController
public class EmployeeController{
#GetMapping(value = "/employee/{joiningYear}",produces = MediaType.APPLICATION_JSON_VALUE)
public List<String> getEmployeeById(#PathVariable int joiningYear) throws YearViolationException {
if(joiningYear < 2014){
throw new YearViolationException("year should not be less than 2014");
}else{
// send all employee's names joined in that year
}
return null;
}
}
ExceptionHandler
#RestControllerAdvice
public class GlobalControllerExceptionHandler {
#ExceptionHandler(value = { YearViolationException.class })
#ResponseStatus(HttpStatus.BAD_REQUEST)
public ApiErrorResponse yearConstraintViolationExceptio(YearViolationException ex) {
return new ApiErrorResponse(400, 5001, ex.getMessage());
}
}
CustomException
public class YearViolationException extends Exception {
/**
*
*/
private static final long serialVersionUID = 1L;
public YearViolationException(String message) {
super(message);
}
}
Junit to unit test exception handler
#RunWith(PowerMockRunner.class)
#WebAppConfiguration
#SpringBootTest
public class ExceptionControllerTest {
#Autowired
private WebApplicationContext applicationContext;
private MockMvc mockMVC;
#Before
public void setUp() {
mockMVC = MockMvcBuilders.webAppContextSetup(applicationContext).build();
}
#Test
public void testhandleBanNotNumericException() throws Exception {
mockMVC.perform(get("/employee/2010").accept(MediaType.APPLICATION_JSON)).andDo(print())
.andExpect(status().isBadRequest())
.andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON));
}
}
As stated by others, you don't need mockMVC at all. If you want to test REST endpoints, what you need is TestRestTemplate.
Runwith SpringRunner.class is important as well as the WebEnvironment setup.
#RunWith(SpringRunner.class)
#SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
public class RestServiceApplicationTests {
private String baseUrl = "http://localhost:8090";
private String endpointToThrowException = "/employee/2010";
#Autowired
private TestRestTemplate testRestTemplate;
#Test(expected = YearViolationException.class)
public void testhandleBanNotNumericException() {
testRestTemplate.getForObject(baseUrl + endpointToThrowException, String.class);
}
From how your setup looks, you don't need to use Mocks at all. It seem's like you want to load the complete application context and use mockMVC to send requests against your rest controller. This is actually and integrationtest!
Now, unfortunately we use Spring Boot 1.3 here, so I'm not sure if the combination of #RunWith(PowerMockRunner.class) and #SpringBootTest in fact loads the Application context. Check your logs and see if it does and if not, try this:
#RunWith(SpringJUnit4ClassRunner.class)
#SpringApplicationConfiguration(classes = Application.class)
#WebAppConfiguration
If, on the other hand you want to make a simple unit test, then you don't need to load the application context. Instead you can just use regular Mockito with #Mock and #InjectMocks in conjuntion with #RunWith(MockitoJUnitRunner.class) and call the method you want to test directly as you would any other method under test.
Hope this help.

Related Links

DRY Spring AnnotationConfig testing
How To Configure MySQL DataSource In Tomcat 7 using hibernate and spring?
Looking for a solution to extend Spring MVC with another Component/Annotation
Unable to autowire Service with Controller Spring
Maybe bad jasper report dependency in pom.xml
How to make Spring 3.2 Async Servlet-Filter defined in Java Config..without having web.xml
Entity access based on owner user
Spring security 3.1.4 backdoor
Spring MVC JSP Form not pre-populating (or just back)
Spring HibernateTemplate autocommit false
Spring EJB remote interface call
File Upload Path in Spring MVC
Hibernate integration with Spring not working in hippo cms site project
Persisting an Entity after encountering Exception
JPA inheritance mapping with discriminator on existing column
how to use MongoRepository to CRUD in a dynamic collection

Categories

HOME
crystal-reports
semantic-ui
jenkins-plugins
openssl
winapi
ubuntu-16.04
playframework
gspread
iis-7.5
wicket
xamarin-studio
cortex-a
xul
mod-pagespeed
opera-mini
r-lavaan
aspell
bootstrap-popover
atlassian-plugin-sdk
jogl
attask
uiautomator
countif
csh
continuous-deployment
hash-collision
vcard
pentaho-report-designer
positioning
hibernate-cache
encase
apache-cloudstack
pyscripter
preg-grep
spring-insight
idl
node-horseman
vmd
swagger-editor
elfinder
parent
infusionsoft
react-native-router-flux
jdbi
rkt
automator
lumen-5.3
timesten
recycle-bin
proof
number-theory
dimple.js
rpostgresql
pycurl
redux-router
objloader
gradle-script-kotlin
uistackview
cron-task
scalar
listadapter
mercurial-hook
approval-tests
asymptote
hyperthreading
affix
apigee-baas
coypu
code-first-migrations
adodb
proximity
omnifocus
dto
indexing-service
reserved-words
java.util.date
ng-pattern
apache2.2
qtgui
prng
mvccontrib
maven-ear-plugin
scrollto
z-machine
msgbox
datamember
printing-web-page
associative
ets
revert
opcodes
handheld

Resources

Mobile Apps Dev
Database Users
javascript
java
csharp
php
android
MS Developer
developer works
python
ios
c
html
jquery
RDBMS discuss
Cloud Virtualization
Database Dev&Adm
javascript
java
csharp
php
python
android
jquery
ruby
ios
html
Mobile App
Mobile App
Mobile App