Exception test for service layer
本问题已经有最佳答案,请猛点这里访问。
我有一门课看起来像这样:
1 2 3 4 5 6 7 8 9 10 | @Service @Transactional public class BookServiceImpl implements BookService { @Autowired private BookRepository bookRepository; public void removeOne(Long id) throws DataAccessException { bookRepository.delete(id); } } |
我的异常测试看起来像这样
1 2 3 4 5 6 7 8 9 10 | @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()方法中查找异常的适当测试吗?
可能你的服务中有
编写正确测试有两种可能的方法:
使用@rule是测试异常情况的正确方法。
更新:测试服务层异常情况的最简单方法是模拟存储库类以抛出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @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); } |