最近,在一次代码审查中,一位同事说“测试不应该有try-catch块”。他还向我指出了关于ExpectedException
的信息,我可以使用它重写对异常数据执行检查的一些测试。
然而,我遇到了一种情况,我不确定我是否能消除试捕。我正在为一个方法编写单元测试,该方法将抛出一个异常,并执行一些我需要使用JMockit验证的行为。假设测试中的代码包含如下内容
try {
...code...
} catch (SomeException e) {
statusMessage.send("Failure", <parameters with some data>);
throw e;
}
JUnit测试当前看起来像
@Test
public void test() {
... set things up ...
try {
callTheMethod();
fail("No exception thrown");
} catch (Exception e) {
assertEquals(SomeException.class, e.getClass());
}
new Verifications() { {
statusMessage.send("Failure", <expected data>);
} }
}
我找不到摆脱试捕的好方法。就我个人而言,我不认为有问题,但如果我不至少试着摆脱它,我可能会从我的同事那里得到麻烦:):):):)
fail
和assertequals
不是必需的。如果有一种简单的方法告诉JUnit/jMockit忽略CalltheMethod()
中的任何异常并继续,那就很好了--我可以创建另一个测试来检查异常。
是否有一些JUnit或JMockit特性可以让我完成我正在尝试做的事情?
[注意:编辑是为了明确我测试的行为是对模拟对象的调用,而不是静态方法调用。它真的与问题无关。]
您的同事在一般意义上可能是正确的,使用try-catch
测试异常处理不如使用提供的ExpectedException
实用程序。然而,我认为那条规则不适用于你的案子;捕捉异常以便您可以验证其他事情是完全合理的。Afaik没有其他方法可以阻止异常的传播。
我有一个返回类型为的方法。它还可以抛出许多异常,所以我想测试一下那些被抛出的异常。所有尝试都失败了,原因相同: 类型Stubber中的(T)不适用于参数(void)时的方法 有什么想法,我可以如何获得方法抛出一个指定的异常?
问题内容: 如果参数无效,如何使用JSR-303验证方法参数并引发异常? 例如像这样:? 现在,我检查方法主体中的每个方法参数,例如 而且我觉得这很丑。 PS作为参考实现,我使用Hibernate-validator 4.1.0.Final 问题答案: 如果可以升级到Hibernate Validator 4.2.0或更高版本,则可以使用其方法验证功能,该功能为方法参数和返回值的验证提供支持。 可
问题内容: 我有一个带有返回类型的方法。它还可以引发许多异常,因此我想测试所引发的异常。所有尝试均以相同的原因失败: Stubber类型中的when(T)方法不适用于参数(void) 有什么想法可以获取引发指定异常的方法吗? 问题答案: 括号放置不正确。 您需要使用: 而 不是 使用: 在文档中对此进行了解释
考虑以下代码: 我想做的是,在异常测试中,标记我希望调用doSomething1()。然而,在转换器上抛出异常。convert(),这意味着永远不会调用verify()调用。因此,verifyNoMoreInteractions()在after()中失败。 注意:这是一个非常通用的示例,用于隐藏我们的任何内部代码。
我想问一下这种行为的原因,因为在运行Spring方法/类时,我似乎不完全理解Hibernate中的和之间的区别。 下面的代码应该回滚DB操作,但它没有回滚(整个类注释为): 以下代码在引发异常时按预期回滚: save()方法来自类,因此它的代码是: 该实体是一个已存在的实体,因此我理解它正在执行。根据JPA规范: find方法(前提是在没有锁的情况下调用它或使用LockModeType.None调
问题内容: 在我的使用Mockito的单元测试中,我想验证未抛出该异常。 我的测试设置了,设置了对象和属性,以便该方法将抛出。 我 确认 从未调用过Calling.method()。 我想要测试失败,因为它抛出,然后我想编写一些代码来解决此问题。 我注意到的是,测试始终会通过,因为永远不会抛出异常。 问题答案: tl; dr JDK8之后:使用 AssertJ 或自定义lambda来声明 异常 行