有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Mockito mock子类方法调用

我正在处理遗留代码,并试图为我所做的实现编写一个单元测试。我的结构如下:

   AbstractClass:
    ----------------

    public AbstractClass {

    abstract method2();

     void method1(){   
      ...does something...
      ..calls --> method2()
     }
    }

    Subclass
    ------------
    public Subclass extends AbstractClass(){

     void method2(){
      ..do something....
      ..mockThisMethod()...

       return true;   
     }
 }

我有一个抽象类,它用特定的方法实现了一些逻辑。 此方法调用的方法比子类中实现的另一个方法调用的方法多。子类中的方法调用我想要模拟的其他方法

在不改变实现代码(难以改变)的情况下,这是可能的吗? 大多数研究结果都建议使用mockito间谍技术,但并不奏效

我遵循了这里的测试设计描述:

https://www.tildedave.com/2011/03/06/pattern-stubbing-legacy-superclasses-with-mockito-spies.html

我所做的是:

 Subclass subclass= spy(Subclass.class);
 when(subclass.mockThisMethod()).thenReturn(something);
 subclass.method1() (I am not sure if this line is correct?)

所以我想要避免的是,在Subclass中调用方法(mockThisMethod)。 因为这个方法做了一些数据库之类的事情。我知道如果我使用对象组合而不是继承,测试会更容易,但在这一点上,很难改变整个实现。上面的代码不起作用。。我有一个NPE


共 (1) 个答案

  1. # 1 楼答案

    1)将类传递给静态Mockito.spy方法不会创建间谍。 相反,您必须传递该特定类的实例:

    Subclass subclassSpy = spy(new Subclass());
    

    也可以考虑使用注释:

    @Spy
    private Subclass subclassSpy = new Sublcass();
    
    @Before
    public void init(){
       MockitoAnnotations.initMocks(this);
    }
    

    2)在刺杀间谍时避免使用when.thenReturn。 相反,使用doReturn..when..methodCall

    doReturn(something).when(sublcass).mockThisMethod(); 
    

    否则,在存根时将调用实际方法,这可能会导致不必要的行为和/或异常