如何声明void方法使用Mockito和catch-exception抛出Exception?

时间:2017-02-15 06:32:14

标签: java junit

我正在尝试测试这种方法:

public void deleteCurrentlyLoggedInUser(Principal principal) {
    if (findLoggedInUser(principal) == null) {
        throw new UserAlreadyDeletedException();
    }
    userRepository.delete(findLoggedInUser(principal));
}

这是findLoggedInUser:

User findLoggedInUser(Principal principal) {
    return userRepository.findByUsername(principal.getName());
}

到目前为止,这是我的测试:

@Test
public void shouldThrowExceptionWhenUserNotFound() {
    // given
    when(sut.findLoggedInUser(principalStub)).thenReturn(null);

    // when
    sut.deleteCurrentlyLoggedInUser(principalStub);

    // then
    catchException
    verify(userRepositoryMock, never()).delete(any(User.class));
}

那么如何使用catch-exception来捕获异常呢?我正在测试的方法返回void,我似乎无法找到断言发现异常的方法。

编辑:我知道我可以使用:@Test(expected = UserAlreadyDeletedException.class)但是我想将整个项目切换到catch异常,因为它更好并且在@Test中使用预期不是很合理。

2 个答案:

答案 0 :(得分:1)

使用规则可能对您有用吗?

  

规则允许非常灵活地添加或重新定义测试类中每个测试方法的行为。测试人员可以重用或扩展下面提供的规则之一,或者自己编写。

您可以在此处详细了解junit4的这个简洁功能:

https://github.com/junit-team/junit4/wiki/Rules

示例:

Ctrl-V

答案 1 :(得分:1)

我从未听说过catch异常,但它看起来并不像是一个最新的库:主要源代码的最后一次更新(在撰写本文时)是on May 3 2015

如果您使用的是Java 8,并且可以使用JUnit 4.13或更高版本,则可以使用assertThrows

assertThrows(
    UserAlreadyDeletedException.class,
    () -> sut.deleteCurrentlyLoggedInUser(principalStub));

如果您要将所有代码迁移到某些内容,这似乎是一个更好的长期赌注。