mockito,间谍 - 不确定它是如何为部分嘲笑做的

时间:2013-10-01 22:56:49

标签: java unit-testing mockito powermock

我有一个类,我想在这里模拟某些类的方法并测试其他方法。这是我可以证明并证明它有效的唯一方法。

class UnderTest{
   public void methodToTest(){
     methodToCall1()
     methodToCall2()
   }


  public void methodToCall1(){
  }

  public void methodToCall2(){
  }

}

现在,因为我想测试第一个方法,我想创建一个UnderTest的部分模拟,这样我就可以验证这两个方法是否被调用。 我如何在Mockito实现这一目标?

感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

你提到你想做两件事:
1. Create real partial mocks
2. Verify method invocations

但是,由于您的目标是确认实际调用了methodToCall1()methodToCall2(),因此您需要做的只是spy on the real object。这可以通过以下代码块完成:

    //Spy UnderTest and call methodToTest()
    UnderTest mUnderTest = new UnderTest();
    UnderTest spyUnderTest = Spy(mUnderTest);
    spyUnderTest.methodToTest();

    //Verify methodToCall1() and methodToCall2() were invoked
    verify(spyUnderTest).methodToCall1();
    verify(spyUnderTest).methodToCall2();

如果未调用其中一个方法,例如methodToCall1,则会抛出异常:

    Exception in thread "main" Wanted but not invoked:
    undertest.methodToCall1();
    ...

答案 1 :(得分:2)

package foo;

import static org.mockito.Mockito.verify;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Spy;
import org.mockito.runners.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class FooTest {

    @Spy
    private UnderTest underTest;

    @Test
    public void whenMethodToTestExecutedThenMethods1And2AreCalled() {
        // Act
        underTest.methodToTest();

        // Assert
        verify(underTest).methodToCall1();
        verify(underTest).methodToCall2();
    }

}