服务层的异常测试[重复]
Posted
技术标签:
【中文标题】服务层的异常测试[重复]【英文标题】:Exception test for service layer [duplicate] 【发布时间】:2018-07-18 11:08:09 【问题描述】:我有一个如下所示的课程:
@Service
@Transactional
public class BookServiceImpl implements BookService
@Autowired
private BookRepository bookRepository;
public void removeOne(Long id) throws DataAccessException
bookRepository.delete(id);
我的异常测试是这样的
@Rule
public final ExpectedException exception = ExpectedException.none();
@Test
public void removeOneThrowsNullPointerException()
BookService foo = new BookServiceImpl();
exception.expect(NullPointerException.class);
foo.removeOne(1L);
现在这个测试通过了,但首先为什么必须实例化 BookService 类,通常如果是一个简单的单元测试,这个测试会通过,因为我们有一本 id 为 1L 但现在它为空的书,我已经阅读了关于 @Rule 的文章,到底发生了什么?这是在 removeOne() 方法中查找异常的正确测试吗?
【问题讨论】:
【参考方案1】:您的服务中可能有NullPointerException
上的bookRepository
。换句话说,它没有正确自动接线。您是否尝试调试此测试以查看究竟是什么对象为空?
有两种方法可以编写正确的测试:
-
对于集成测试,您需要关心自动装配所有依赖项,请阅读
Spring
和测试。
对于纯单元测试,您需要关注所有依赖项的模拟。
@Rule 的使用是测试异常情况的正确方法。
更新:
测试服务层异常情况的最简单方法是模拟您的存储库类以抛出 DataAccessException
并将其注入服务类:
@Rule
public final ExpectedException exception = ExpectedException.none();
@Test
public void removeOneThrowsDataAccessException()
BookRepository mockedRepository = Mock(BookRepository.class);
when(mockedRepository.get(1L)).thenThrow(new DataAccessException());
BookService foo = new BookServiceImpl(mockedRepository);
exception.expect(DataAccessException.class);
foo.removeOne(1L);
【讨论】:
我的问题不是关于空指针,当我们没有空实例或变量时会发生这种情况,但通常我的任务是为大约 10 个正常工作的服务逻辑编写异常测试,所以我应该如何在这个测试中返回异常?我也在测试我给方法一个空参数的场景 测试服务层异常情况的最简单方法是模拟您的存储库类以抛出DataAccessException
并将其注入服务类。
你能用代码 sn-p 说明你的意思吗?谢谢
查看更新后的我的帖子。
无法导入测试中使用的 Mock u @Dmytro maslenko以上是关于服务层的异常测试[重复]的主要内容,如果未能解决你的问题,请参考以下文章
JUnit 测试 Android NullPointerException
服务层的配置发布服务 taotao-manager-daotaotao-manager-interfacetaotao-manager-service