服务层的异常测试

时间:2018-02-08 01:23:51

标签: java exception testing

我有一个看起来像这样的课程:

@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()方法中找到异常的正确测试吗?

1 个答案:

答案 0 :(得分:1)

您服务中的NullPointerException可能有bookRepository。换句话说,它没有正确自动装配。您是否尝试调试此测试以查看究竟对象是什么?

有两种方法可以编写正确的测试:

  1. 对于集成测试,您需要关心自动装配所有依赖项,阅读Spring并进行测试。
  2. 对于纯单元测试,您需要关心模拟所有依赖项。
  3. 使用@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);
    }