不抛出测试异常

时间:2015-10-13 13:46:22

标签: java testing exception-handling junit4

我正在创建集成测试:

@RunWith(CdiRunner.class)
@AdditionalClasses({FollowUpActivityRepository.class, SettingsPropertiesProducer.class})
public class FollowUpActivityFeaturesTest {

  @Inject protected FollowUpActivityService fuaService;

  @Test
  public void DigitalInputTOFollowUpActivityFIELDS()
  { 
    FollowUpActivityDTO dto = new FollowUpActivityDTO();
    dto.setId("id");
    dto.setTimestamp(Date.from(Instant.now()));
    dto.setDueTimestamp(Date.from(Instant.now()));
    dto.setClosingTimestamp(Date.from(Instant.now()));
    dto.setMatter("matter");
    dto.setComment("comment");

    this.fuaService.createOrUpdate(dto); 

  }

}

createOrUpdate就像:

public void createOrUpdate(FollowUpActivityDTO dto) throws RepositorySystemException

所以,我需要检查这个异常是 NOT 抛出。

我想优雅地做。

实际上,我正在使用junit 4.12和hamcrest 2.0.0.0。

有什么想法吗?

示例

在.NET中,我正在使用NSubstitute来实现:

this.apiClient.Invoking(c => c.GrantAuthorization()).ShouldNotThrow();

1 个答案:

答案 0 :(得分:3)

在颠倒了问题的含义后,

编辑

如果您希望测试在抛出Exception时失败,那么除了在测试方法签名的throws部分中声明Exception之外,您没有其他任何事情要做(如果抛出Exception,则不是必需的)某种RuntimeException,但你的显然不是:

public void DigitalInputTOFollowUpActivityFIELDS() throws Exception

无需指定任何类型的异常。无论如何,任何jUnit测试都会在抛出未处理的异常时失败(这是您期望的行为)。

来自this blog

  

声明它们抛出一种特定类型的测试方法   异常是脆弱的,因为它们必须在方法时更改   在测试中的变化。

旧回答:

只需编写您的测试注释:

@Test(expected=RepositorySystemException.class)

这样,只要抛出此异常,测试方法就会成功。

请参阅javadoc

您的评论后

修改

要针对任何异常验证测试,只需:

@Test(expected=Exception.class)

但正如B. Dalton所说,这似乎有点危险,因为这个测试会传递任何异常,无论它是否是你期待的那个或者任何其他。

为了完整起见,你也可以这样做(基于this answer):

@Rule
public ExpectedException thrown = ExpectedException.none();

@Test
public void DigitalInputTOFollowUpActivityFIELDS()
{ 
    FollowUpActivityDTO dto = new FollowUpActivityDTO();
    dto.setId("id");
    dto.setTimestamp(Date.from(Instant.now()));
    dto.setDueTimestamp(Date.from(Instant.now()));
    dto.setClosingTimestamp(Date.from(Instant.now()));
    dto.setMatter("matter");
    dto.setComment("comment");

    thrown.expect(Exception.class);
    thrown.expectMessage("something you can check"); // if needed

    this.fuaService.createOrUpdate(dto); 
}

这样,createOrUpdate仍然可以通过抛出任何类型的异常来验证测试,但至少方法的其余部分不会。

请参阅ExpectedException的javadoc。

或者,当然,这是一个很好的旧解决方案:

try {
    this.fuaService.createOrUpdate(dto); 
    fail("this should throw an exception");
} catch (RepositorySystemException e){
    // pass
} catch (Exception e){
    // pass
}

这不太优雅,但允许您根据需要调整异常处理。