【问题标题】:mocking protected method模拟受保护的方法
【发布时间】:2012-01-08 21:04:49
【问题描述】:

我想模拟一个继承的受保护方法。我不能直接从java代码调用这个方法,因为它是从另一个包中的类继承的。我找不到在when(...) 中指定此方法存根的方法

package a;

public class A() {
    protected int m() {}
}

package b;

public class B extends a.A {
    // this class currently does not override m method from a.A
    public asd() {}
}

// test
package b;

class BTest {
    @Test
    public void testClass() {
        B instance = PowerMockito.spy(new B());
        PowerMockito.when(instance, <specify a method m>).thenReturn(123);
        //PowerMockito.when(instance.m()).thenReturn(123); -- obviously does not work
    }
}

我查看了PowerMockito.when 覆盖,这似乎都只用于私有方法!

如何指定受保护的方法?

【问题讨论】:

  • @AndroidKiller,用类名更新了代码。实际上它们可能来自 Mockito,但我使用 powermock 并且这些方法在那里具有相同的含义
  • 这就是为什么我们应该总是更喜欢组合而不是继承的原因。如果你不能在你的测试代码中重新定义这个方法,就像你对遗留代码所做的那样。

标签: java mockito powermock powermockito


【解决方案1】:

简而言之:不能总是使用when 来存根间谍;使用doReturn

假设 spydoReturn 的静态导入(PowerMockito):

@RunWith(PowerMockRunner.class)
@PrepareForTest(B.class)
public class BTest {
    @Test public void testClass() throws Exception {
        B b = spy(new B());
        doReturn(42).when(b, "m");
        b.asd();
    }
}

您也可以@PrepareForTest(A.class) 并在when(a, "m") 上设置doReturn。哪个更有意义取决于实际测试。

【讨论】:

  • 哇,谢谢。有趣的是,当我尝试使用方法实例而不是方法字符串名称存根失败时,出现关于错误数量参数的异常消息。但是字符串名称一切正常。
  • @mishanesterenko 是的,它有时会有点复杂。另一个选项是始终为测试目的子类化B。并不总是一种选择,但没有修改字节码那么“神奇”;)
  • 如果您设置 Methode 返回 void,您会怎么做。假设m 是一个类似于 void m(MySpecialParser parser) 的集合方法。这个解析器用于解析我的文本。我怎样才能模拟它?
  • @Kayser 没有doNothing吗?我不记得了。
  • 好答案。 FWIW:它几乎遵循PowerMock's doc 的约定(“私有方法的部分模拟的完整示例”部分也适用于受保护的)。
猜你喜欢
  • 1970-01-01
  • 2016-03-17
  • 2018-10-12
  • 1970-01-01
  • 2016-03-09
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多