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

FactoryBean.getObjectType has been called and causes Null exception before setting pojo setter
Spring Batch skip job execution if job with same parameters (but different date/time) in progress
Spring MVC with thread safety
grails - get current user globally
cURL Multipart/form-data post request
#RolesAllowed vs. #PreAuthorize vs. #Secured
How Hibernate Validation message pulled from messages.properties in Spring?
Custom Login Page through LDAP in Spring Boot
How to autowire Hibernate SessionFactory in Spring boot
How do I use spring data jpa to query jsonb column?
Combining multiple submitted fields into a single property
How to define a bean for PersistentEntityResourceAssembler?
How to deploy Spring Boot App in a subdirectory on Heroku
ADFS integration using Spring SAML -SP metadata vs IDP metadata?
How to embed a date object in #Query Spring Data JPA without passing an argument in interface method
Using Spring Web Reactive to distribute state “updates” to a large number of clients

Categories

HOME
shopify
drupal-7
wildcard
extract
computer-vision
command
windows-store-apps
is-empty
javamail
ll
tizen-wearable-sdk
netflix-feign
pca
unity2d
keystore
rfid
dryioc
cs-cart
activesync
event-log
lenskit
spring-cloud-config
apache-karaf
jcl
eclipselink
apply
source-maps
continuous-deployment
excel-2013
rowcount
spring-profiles
pyscripter
idl
getline
modelandview
web-audio-api
service-locator
lego
liquid-xml
inkscape
sonarqube-scan
delphi-10.1-berlin
tic-tac-toe
web-development-server
tripwire
intersystems-ensemble
median
scalafx
proof
gd
windows-firewall
nstouchbar
sapui
istorage
mouseclick-event
udev
text-classification
jexl
pycurl
ingres
typhoon
mongoose-populate
windows-nt
image-editing
date-format
bluesnap
asymptote
insertion-sort
persistence.xml
sevenzipsharp
anti-patterns
castle-windsor-3
twitter-rest-api
ibm-data-studio
stackframe
uptodate
searchkick
orientation-changes
pgagent
temp-tables
omnifocus
ibmsbt
ghostdoc
dalekjs
data-generation
chrome-for-android
sim900
bfd
sslexception
vertical-rhythm
javascriptmvc
dynamic-binding
surveyor-gem
digital-design
fraud-prevention
htmltextwriter
marmalade-edk
radchart
static-variables
fotoware
caliper
hibernate3
hobo
v4l
hinstance
selectmanycheckbox
handwriting
out-of-browser
document-library





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