如何在没有界面的情况下创建 类 的模拟对象

How to create mock object of classes without interface

interface CheakeId {

     public void verify();

}

class CreateAccount implements CheakeId {

       public String gmail(){

            return "abc@gmail.com";
       }

      @Override
      public void verify() {

             System.out.println("verify");
      }

}

CheakId cheakid = Mockito.mock(CreateAccount.class);

问题:如果我们创建子class的模拟对象,我们可以将子class的引用存储在父class的引用变量中吗?

class Night {

     public void sleep() {

         System.out.println("sleep");
     }

}

Night night = Mockito.mock(Night.class);

问题:我们可以只创建接口的模拟对象,还是可以创建没有接口的 classes 的模拟对象?

在遥远的过去,人们使用 Java 的动态代理功能来生成模拟,并且仅适用于接口。参见 https://www.baeldung.com/java-dynamic-proxies

另一种生成模拟的方法是使用字节码生成器,如 cglib 和 bytebuddy,这也适用于没有接口的 classes。自 Mockito 1.0、IIRC 以来支持此功能。

一些限制适用。例如。您不能存根在 class 中声明为 final 的方法,也不能存根 equals 和 hashCode 方法。

使用 classes,如果你想保留 class 的实现,你也可以使用 'spy' 而不是 'mock',并且使用 mockito 只是为了验证.

所以基本上:您的代码应该可以工作。

CheakId cheakid = Mockito.mock(CreateAccount.class);
Night night = Mockito.mock(Night.class);