我正在创建集成测试:
@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();
答案 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
}
这不太优雅,但允许您根据需要调整异常处理。