【问题标题】: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() 方法中查找异常的正确测试吗?

【问题讨论】:

    标签: java exception testing


    【解决方案1】:

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

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

    1. 对于集成测试,您需要关心自动装配所有依赖项,请阅读 Spring 和测试。
    2. 对于纯单元测试,您需要关注所有依赖项的模拟。

    @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
    猜你喜欢
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 2013-11-01
    • 2022-10-13
    • 2013-08-13
    相关资源
    最近更新 更多