Spring MVC全局异常处理和单元测试_动力节点Java学院整理

Spring MVC是一种流行的Java Web框架,其拥有全局异常处理机制,可以在程序抛出异常后,统一处理并返回指定的错误信息。本篇攻略主要包含两部分内容,分别是Spring MVC全局异常处理和单元测试。

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学院整理

基础教程推荐