【问题标题】:How to mock private method using Power Mockito?如何使用 Powermockito 模拟私有方法?
【发布时间】:2017-11-16 19:47:24
【问题描述】:

我试图模拟我的私有方法,但我得到了java.lang.IllegalArgumentException: object is not an instance of declaring class。下面是我的方法

private String decodeResponse(byte bresp[])
    {

        String spresp = null;
        //
        return spresp;
    }

下面是我的测试课,

@PrepareForTest(MyClass.class)
    @RunWith(PowerMockRunner.class)
    public class MyClassTest{

    @Test
    public void test() throws Exception {
        PowerMockito.spy(MyClass.class);
        PowerMockito.doReturn("abcdefg").when(MyClass.class, "decodeResponse",Matchers.anyByte());
    }   
    }

我在过去 3 小时内都陷入了这个问题。任何帮助都将不胜感激。

【问题讨论】:

  • 你应该避免使用 Powermock(主要是因为它很慢)。您应该保护私有方法并在测试中“滥用”这种可见性
  • 你不需要模拟私有方法,因为它与 tdd 无关
  • @fxrbfg 我的私有方法正在从另一个公共方法调用
  • 这不是tdd的方式,需要自己理解。测试私有方法是滥用。您只需要测试公共方法。
  • @fxrbfg 是的,我同意。但是在这种情况下,这个特殊的私有方法是从另一个公共方法调用的。而且在这个私有方法中,我的数据库连接也是如此。

标签: java unit-testing junit powermockito


【解决方案1】:
    @PrepareForTest(MyClass.class)
    @RunWith(PowerMockRunner.class)
    public class MyClassTest{

    @Test
    public void test() throws Exception {
        MyClass myClassSpy = PowerMockito.spy(MyClass.class);
        PowerMockito.doReturn("abcdefg").when(myClassSpy, "decodeResponse",any(byte[].class));
    }   
    }

【讨论】:

  • MyClass 有一个带参数的构造函数 MyClass communicator=new MyClass(obj1,obj2);您还可以解释一下“any(byte[].class)”这部分吗?
  • 是否可以模拟私有方法?
  • 因为你的方法接受字节数组,你不能使用 Matchers.anyByte()。 Matchers.anyByte() 这意味着任何单个字节而不是字节数组
  • “是否可以模拟私有方法”是什么意思。当然有可能。上面的代码就是这样做的
  • 好的,谢谢 Kiran,但是在这个区域有一些语法错误 .any(byte[].class)
猜你喜欢
  • 2015-03-23
  • 2014-10-24
  • 2018-05-03
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 2019-09-06
相关资源
最近更新 更多