服务层的异常测试[重复]

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

服务返回对象的设计

在Java中测试服务层中的void方法[重复]

服务层的配置发布服务 taotao-manager-daotaotao-manager-interfacetaotao-manager-service