Spring MVC是一种流行的Java Web框架,其拥有全局异常处理机制,可以在程序抛出异常后,统一处理并返回指定的错误信息。本篇攻略主要包含两部分内容,分别是Spring MVC全局异常处理和单元测试。
一、Spring MVC全局异常处理
1.1 在Spring配置文件中配置异常处理拦截器
在Spring的配置文件中,可以配置一个全局的异常处理拦截器,用来捕获应用程序中抛出的异常。该拦截器需要实现HandlerExceptionResolver接口,并在配置文件中进行配置。
<bean class="com.example.ExceptionHandler"/>
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</list>
</property>
</bean>
1.2 定义异常处理类
定义一个异常处理类,实现HandlerExceptionResolver接口,并实现resolveException方法,该方法中可以对不同异常进行分类处理。
@Component
public class ExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
ModelAndView modelAndView = new ModelAndView();
if (ex instanceof BusinessException) {
modelAndView.addObject("errorMsg", ex.getMessage());
modelAndView.setViewName("error/business_error");
} else if (ex instanceof AuthorityException) {
modelAndView.addObject("errorMsg", ex.getMessage());
modelAndView.setViewName("error/authority_error");
} else {
modelAndView.addObject("errorMsg", "系统内部错误,请稍后再试!");
modelAndView.setViewName("error/system_error");
}
return modelAndView;
}
}
1.3 自定义异常类
自定义异常类可以用来分类处理不同类型的异常。例如,BusinessException用来处理业务异常,AuthorityException用来处理权限异常。
public class BusinessException extends RuntimeException {
public BusinessException(String message) {
super(message);
}
}
public class AuthorityException extends RuntimeException {
public AuthorityException(String message) {
super(message);
}
}
1.4 抛出异常
在应用程序中,可以通过抛出自定义异常的方式让全局异常处理器捕获并处理异常。
public void delete(Long id) {
if (id == null || id <= 0L) {
throw new BusinessException("ID不合法!");
}
if (repository.delete(id) == 0) {
throw new BusinessException("删除失败,数据可能已不存在!");
}
}
1.5 配置视图解析器
在Spring MVC的配置文件中,配置视图解析器,用于解析视图名称,并将其转换为真正的视图对象。在本例中,使用了JSP视图解析器,并将异常处理的视图页面放在了WEB-INF目录下的error子目录中。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
至此,Spring MVC全局异常处理配置完成。
二、单元测试
单元测试是软件开发过程中必不可少的一环,能够有效地保证软件的质量和稳定性。在本例中,使用了JUnit和Mockito两个Java测试框架。
2.1 配置pom.xml
在pom.xml文件中添加JUnit和Mockito的依赖。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.22.0</version>
<scope>test</scope>
</dependency>
2.2 编写单元测试类
编写单元测试类,使用Mockito对依赖对象进行模拟,然后测试要求的功能。
@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {
@InjectMocks
private UserServiceImpl service;
@Mock
private UserRepository repository;
@Test
public void testDelete() {
when(repository.delete(1L)).thenReturn(1);
service.delete(1L);
verify(repository, times(1)).delete(1L);
}
}
2.3 运行测试
通过运行JUnit测试,可以验证代码的正确性,并及时发现问题并修复。
至此,单元测试部分完成。
示例一:
public void testDelete() {
when(repository.delete(1L)).thenReturn(1);
service.delete(1L);
verify(repository, times(1)).delete(1L);
}
该单元测试用来测试业务服务的delete方法是否能够正确地调用持久层的delete方法,并返回正确的结果。
示例二:
public void testResolveException() {
ModelAndView modelAndView = exceptionHandler.resolveException(request, response, null, new BusinessException("业务异常"));
Assert.assertNotNull(modelAndView);
Assert.assertEquals("业务异常", modelAndView.getModel().get("errorMsg"));
Assert.assertEquals("error/business_error", modelAndView.getViewName());
}
该单元测试用来测试全局异常处理器能否正确地处理业务异常,并且返回正确的错误页面。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring MVC全局异常处理和单元测试_动力节点Java学院整理 - Python技术站