java-不引发测试异常

我正在创建一个集成测试:

@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

因此,我需要检查是否未抛出此异常.

我想做得优雅.

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

有任何想法吗?

在.NET中,我使用NSubstitute来实现这一点:

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

解决方法:

反转问题的含义后进行编辑:

如果您希望在引发Exception时测试失败,那么您只需要在测试方法签名的throws部分声明Exception就可以做其他事情(如果抛出的Exception是某种RuntimeException,则不是强制性的,但是您必须显然不是):

public void DigitalInputTOFollowUpActivityFIELDS() throws Exception

无需指定任何种类的异常.无论如何,一旦抛出未处理的Exception(这是您期望的行为),任何jUnit测试都将失败.

this blog开始:

Test methods that declare that they throw one particular type of
exception are brittle because they must be changed whenever the method
under test changes.

旧答案:

像这样编写测试注释:

@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仍然可以通过引发任何类型的Exception来验证测试,但至少该方法的其余部分不能.

请参阅javadoc以获取ExpectedException.

或者,当然是好的旧解决方案:

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

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

上一篇:vue开发中利用正则限制input框的输入(手机号、非0开头的正整数等)


下一篇:Pyhton函数篇(一)之函数中的形参与实参