繁体   English   中英

如何模拟父类的受保护方法?

[英]How can I mock protected method of parent class?

我尝试模拟父类的受保护方法。 出于这个原因,我使用MockitoPowerMockito 我的父班。

public class Parent {
    protected int foo() {
        throw new RuntimeException("Do not invoke this method.");
    }
}

我的孩子班。

public class Child extends Parent {
    protected int boo() {
        return super.foo();
    }
}

和测试班。

@RunWith(PowerMockRunner.class)
@PrepareForTest({Parent.class, Child.class})
public class ChildTest {

    @Mock
    private Child childMock;

    @Before
    public void before() {
        initMocks(childMock);
    }

    @Test
    public void shouldInvokeProtectedMockedMethod() throws Exception {
        /* Given */
        PowerMockito.doReturn(500).when(childMock, "foo");
        /* When */
        childMock.boo();
        /* Then */
        Mockito.verify(childMock, Mockito.times(1)).boo();
        Mockito.verify(childMock, Mockito.times(1)).foo();
    }

    @After
    public void after() {
        Mockito.reset(childMock);
    }
}

当我运行它时,我收到此错误

Wanted but not invoked:
child.foo();
-> at com.test.ChildTest.shouldInvokeProtectedMockedMethod(ChildTest.java:36)

However, there were other interactions with this mock:
child.boo();
-> at com.test.ChildTest.shouldInvokeProtectedMockedMethod(ChildTest.java:33)

我做错了什么?

如果你想检查真正调用的foo()方法,你既不需要Mockito,也不需要PowerMockito。

捕获运行时异常会通知您已调用foo()方法。

package foo.bar;

import org.junit.Test;

public class ChildTest {

    /**
     * child.boo() calls super.foo(), then throws a RuntimeException.
     */
    @Test(expected = RuntimeException.class)
    public void shouldInvokeProtectedMethod() {
        Child child = new Child();
        child.boo();
    }
}

尝试这样的事情:

@Test
public void shouldInvokeProtectedMockedMethod() throws Exception {
    int expected = 1;
    Child childMock = mock(Child.class);
    when(childMock.foo()).thenReturn(expected);
    when(childMock.boo()).thenCallRealMethod();

    childMock.boo();
    org.mockito.Mockito.verify(childMock, org.mockito.Mockito.times(1)).boo();
    org.mockito.Mockito.verify(childMock, org.mockito.Mockito.times(1)).foo();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM