如何在 void 函数中模拟 void 函数?

How to mock a void function inside a void function?

我有三个 类 A、B 和 BTest。从 B.printThor() 调用时如何验证 A.printHulk()?

public class A
{
    public void printHulk()
    {
        System.out.println("I am Hulk");
    }
}
public class B
{
    private A a;

    @Inject
    public B(A a)
    {
        this.a=a;
    }
    public void printThor()
    {
        System.out.println("I am Thor");
        a.printHulk();
        System.out.println("End");
    }
}
public class BTest
{
    @Mock
    private A a;

    private B b;

    @BeforeMethod
    public void setup()
    {
        MockitoAnnotations.initMocks(this);
        b=new B(a);
    }

    @Test
    public void testPrintThor()
    {
        b.printThor();
        verify(a,times(1)).printHulk();
    }
}

验证 a.printHulk() 出错?由于它是一个 void 函数,我不能在它上面使用 when 和 thenreturn。如何验证它被调用?

你可以这样写你的测试:

@RunWith(MockitoJUnitRunner.class)
public class ClassBTest {

    @Mock
    private A a;

    @InjectMocks
    private B b;

    @Test
    public void testPrintThor() {
        b.printThor();
        Mockito.verify(a).printHulk();
    }
}

或者如果要打印 I am Hulk,您的测试将如下所示:

@RunWith(MockitoJUnitRunner.class)
public class ClassBTest {

    @Spy
    private ClassA a;

    @InjectMocks
    private ClassB b;

    @Test
    public void testPrintThor() {
        b.printThor();
        Mockito.doCallRealMethod().when(a).printHulk();
    }
}