如果我有2个课程:
public class A {
public A(boolean bool){
if(bool){
// currently broken
// would throw RuntimeException
}
B.doSomething();
}
}
和
public class B {
public static void doSomething() throws RuntimeException{
throw new RuntimeException();
}
}
我对班级A
的单元测试将遵循:
public class ATest {
@Test (expected=RuntimeException)
public void testA(){
new A(true);
}
}
实际上,测试会因为B
类方法同时抛出RuntimeException
而成功,并且A
被破坏的事实不会立即显现。
是否有可能告诉JUnit以某种方式忽略来自B
的异常而不使用模拟框架?
答案 0 :(得分:1)
否 - 调用该方法的结果是RuntimeException
,这就是您正在测试的内容。 JUnit是如何区分RuntimeException
来自您正在调用的确切方法和来自相关调用的方法之间的区别?测试规则之一是,您并不打算关心如何获得结果的细节,只需获取 即可。 (例如,您可以将A
构造函数中的块内的代码移动到单独的方法中,这不应该破坏测试。)
目前,只需检查调用new A(false)
没有抛出异常,您就可以轻松完成失败的测试。目前该测试将失败,因为您仍然会调用B.doSomething()
,但仍会抛出。{/ p>
请注意,大多数模拟框架都不会对此有所帮助,因为您正在使用静态方法 - 您至少应该考虑使B成为注入依赖项(可能带有接口),以便进行更多控制
答案 1 :(得分:0)
你通常应该远离原始的'无论如何,异常类,所以解决这个问题的正确方法是创建一个RuntimeException
的子类,它反映了实际出错的地方。
这样你可以在测试用例中引用RuntimeException
的正确子类,你应该没问题。
答案 2 :(得分:0)
如果您没有要捕获的特定RuntimeException
(RuntimeException
的子类),那么我看到的唯一方法是在您的try catch
中添加testA
方法并在catch
中验证异常是否不包含嵌套异常,然后重新抛出异常或调用Assert.fail()