Java 你如何模拟可丢弃的物体?

Java 你如何模拟可丢弃的物体?,java,spring,junit,mockito,Java,Spring,Junit,Mockito,我想为我的应用程序编写Junit测试来处理错误方法,它如下所示 public void myHandlingError(Throwable t) {//content} 我想模拟可丢弃的物体,但我找不到任何例子。 以下是我的想法 public void myHandlingErrorTest(){ Throwable t = new Exception(); myClass.myHandlingError(t); . .

我想为我的应用程序编写Junit测试来处理错误方法,它如下所示

public void myHandlingError(Throwable t) {//content}
我想模拟可丢弃的物体,但我找不到任何例子。 以下是我的想法

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

任何建议都将不胜感激

术语mock在某种程度上意味着您使用诸如EasyMock之类的模拟框架来创建您正在寻找的对象。但对于表示异常的对象,很少需要这样做。您知道,异常通常是在“错误输入”上创建的

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

另一方面,异常是在生产代码中使用new创建的(大多数情况下)。因此,无论如何,没有简单的方法来嘲笑这一点。为异常创建工厂,并使用依赖项注入。。。听起来有点过分了。你看,异常的好处是:在大多数情况下,代码是关于:“抛出的错误输入”。所以您只提供了错误的输入,除了要在测试中抛出以进行进一步验证的异常

在您的例子中,您正在测试实际接收可丢弃/异常对象作为参数的代码;在这里,可以使用您开始使用的方法—在测试中创建对象并将其传递给您的“处理程序”。

要回显,您不应该对异常或一次性使用模拟。这有几个原因:

  • 异常是数据对象的一种类型:异常不是充当协作者,而是在协作者之间携带一段数据。数据对象通常很难模拟,有许多
    get
    方法要存根(对于可变数据对象更是如此,其中
    set
    需要模拟匹配的副作用)。因为数据对象通常没有依赖项和稳定的实现,所以在测试中使用真实类的缺点很少
  • 有一些难以模拟的系统提供的方法,如
    fillInStackTrace
    。你不应该做那种模拟的工作
  • Throwable还有一些无法模仿的
    final
    方法,如
    addsupprested
    getsupprested
    。因为它们是最终的,EasyMock和Mockito不能使用动态代理来覆盖它们,所以要想模拟这些方法,您必须使用PowerMock或其他字节码重写模拟工具
  • 您可以创建并传入各种现有的、易于实例化的、经过良好测试的系统异常,包括
    IllegalArgumentException
    NullPointerException
    ,甚至
    RuntimeException
    本身
  • Throwable、Exception和RuntimeException都是非常明确地设计用于子类化的,因此如果您确实希望使用自定义子类进行测试,那么您可以非常轻松地在测试中创建一个真正的嵌套异常或Throwable子类
如果交互关系与SUT或MUT的一般契约有关,则将模拟留给非数据对象,并将真实对象或输入用于可丢弃和异常