2016-09-06 33 views
2

我想写JUnit测试的错误处理方法为我的应用程序,它看起来像这样你如何模拟可抛物体?

public void myHandlingError(Throwable t) {//content} 

我想小样Throwable对象,但我找不到任何例子。 这是我在想什么...

public void myHandlingErrorTest(){ 
     Throwable t = new Exception(); 
     myClass.myHandlingError(t); 
     . 
     . 
     . 

任何建议,将不胜感激!

回答

7

术语模拟不知何故意味着你使用一个模拟框架,如EasyMock来创建你正在寻找的对象。但对于代表例外的对象来说,这是很少需要的你看,异常通常是在“错误输入”上创建的。

我的测试通常会做什么:将某些“不良”输入驱动到类中;然后期望抛出某个异常。我的测试会捕获该异常,并检索该异常的一个或多个属性;例如它的消息(使用assert进行验证)。

而另一方面:例外情况是您在生产代码(大部分时间)内使用创建的东西。因此,无论如何都没有简单的方法来嘲笑。并创建一个工厂的异常,并使用依赖注入......听起来像是过度杀伤。你看,关于异常的好处是:在大多数情况下,代码是关于:“抛出错误的输入”。所以你只需提供错误的输入,除了在你的测试中抛出异常以进一步验证。

就你而言,你正在测试实际上接收throwable/exceptions对象作为参数的代码;在这里,使用开始的方法就可以了 - 在测试中创建对象并将其传递给“处理程序”。

1

要回显GhostCat's excellent answer,你不应该使用模拟异常或throwables。这是有几个原因:

  • 例外是一类数据对象的:而不是充当合作者,例外携带一块协作者之间的数据。数据对象通常很难模拟,有很多get方法存在(对于可变数据对象更是如此,其中set需要被匹配的副作用模拟)。因为数据对象通常没有依赖关系和稳定的实现,所以在测试中使用真实的类很少有缺点。
  • Throwable有一些难以模拟的系统提供的方法,如fillInStackTrace。你不应该在模拟这样的事情。
  • Throwable还有一些不可能模拟的方法,如addSuppressedgetSuppressed。因为它们是最终的,所以EasyMock和Mockito不能使用动态代理来覆盖它们,所以甚至要模拟这些方法,你必须使用PowerMock或其他一些字节码重写模拟工具。
  • 有各种现有的,易于实例化,经过良好测试的系统例外,您可以创建并传入,包括IllegalArgumentException,NullPointerException,甚至RuntimeException本身。
  • Throwable,Exception和RuntimeException是非常明确地为子类设计的,所以如果你想用自定义的子类进行测试,你可以很容易地在你的测试中创建一个真正的嵌套的Exception或Throwable子类。

离开嘲笑非数据对象,其中互动事项您的SUT或MUT的总承包合同,并使用实物或输入您的抛出异常和异常。