我有一个看起来像这样的课程:
@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但现在它为null的书,我已经读过关于@Rule的文章,究竟发生了什么?这是在removeOne()方法中找到异常的正确测试吗?
答案 0 :(得分: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);
}