使用 Mockito 以嵌套方式测试具有多个自动连线类的函数



在这里我想测试method1 .我想使用 @Mock@InjectMocks 注释来实现它,但使用 class B 作为模拟,它返回 NPE。

 class A {
     @Autowired
     private B b;
     public String method1()
       {
         return b.method2(); 
       }
     }
class B{
     @Autowired
     private C c;
    public String method2(){
       return C.method3();
     }
    }

测试类 :

@InjectMocks
    A a;
    @Mock
    B b = new B();

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }
    @Test
    public void testMethod1() {
    String x=a.method1();
    assertEquals("value",x);
    }

使用@Mock注释时,不要手动实例化变量。

Mockito会为你做这件事,否则你最终会得到普通的实例而不是模拟:

@Mock
B b;

还要确保以某种方式设置模拟以期望某个值:

doReturn(returnString).when(b).method2();

要调用C实际方法,请在测试类中使用@Spy

@Spy
@Autowired
private C c;

请注意,@InjectMocks也可以与@Spy注释结合使用,这意味着 Mockito 会将模拟注入到正在测试的部分模拟中。

另请注意有关将MockitoAnnotations.initMocks(this)@Spy一起使用的警告:

如果你在超类构造函数中调用 MockitoAnnotations.initMocks(this(,那么这将不起作用。这是因为子类中的字段仅在超类构造函数返回后才实例化。最好使用@Before。相反,你也可以把initMocks((放在JUnit runner(@RunWith(中,或者使用内置的MockitoJUnitRunner。

相关内容

  • 没有找到相关文章

最新更新