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