模拟抽象父方法

时间:2014-08-04 19:01:37

标签: unit-testing abstract-class mockito parent legacy

首先:我正在测试遗留代码。

我正在测试一个抽象类,我们称之为A类。

A类具有类B 类型的字段。 Class B 是Abstract基类的子项,我们将调用 B_Base

我的问题:在A类的方法中,B类的实例调用 B_Base中的方法。

我试过模拟一个B类然后用模拟的B类替换Field,但是,每次运行父方法时,Mockito.when()方法中都有一个NullPointerException,这意味着父B_Base类不是嘲笑。

以下是代码的概念。

public abstract class A {     //this is the class Im testing.
      public B bInstance;

      public boolean methodIAmTesting {
           int hello = bInstance.method_Only_In_B_Base();
           ...
      }    
}

测试:

 public class TestClass extends A {
    //here is the constructor etc..

    @Test
    public void test1 {   
        TestClass x = new TestClass();
        bInstance = Mockito.mock(B.class);

        // ERROR IS HERE V
        Mockito.when(bInstance.method_Only_In_B_Base()).thenReturn(50);
        Assert.assertTrue(x.methodIAmTesting());
    }
 }

1 个答案:

答案 0 :(得分:1)

正如J L提到的,你实际上有两个实例,因为你的TestClass扩展了A.

你有什么:

public class TestClass extends A {
  @Test public void test1() {
    Class TestClass x = new TestClass();
    bInstance = Mockito.mock(B.class);
    // ...
  }
}

你想要什么:

public class TestClass extends A {
  @Test public void test1 {
    Class TestClass x = new TestClass();
    x.bInstance = Mockito.mock(B.class);  // <-- replace bInstance on x
    // ...
  }
}

JUnit会自动创建测试类的实例,因此当您致电x = new TestClass()时,您正在创建单独的测试实例,并且您正在设置bInstance = mock(B.class)的调用JUnit创建的实例上的模拟而不是您创建的x实例。

请注意,将JUnit测试类子类化为被测系统是非常不寻常的。请考虑这样的设计:

@RunWith(JUnit4.class)
public class ATest {
  private static class TestClass extends A {
    // ...
  }

  @Test public void test1 {
    Class TestClass x = new TestClass();
    x.bInstance = Mockito.mock(B.class);
    // ...
  }
}