【问题标题】:How to Mock private method which is called from the constructor using PowerMockito如何模拟使用 PowerMockito 从构造函数调用的私有方法
【发布时间】:2016-12-28 13:26:22
【问题描述】:

问题示例:

class ToBeTested {
    private MyResource myResource;
    public toBeTested() {
        this.myResource = getResource();
    }

    private MyResource getResource() {
        //Creating My Resource using information form a DB
        return new MyResource(...);
    }
}

我想模拟getResource(),这样我就可以提供MyResource 的模拟实例。我发现的所有关于如何模拟私有方法的示例都是基于首先创建 ToBeTested 实例然后替换该函数,但是由于在我的情况下它是从构造函数中调用的,所以为时已晚。

是否可以在创建所有实例之前模拟私有函数?

【问题讨论】:

  • 为什么不模拟从getResource() 方法内部访问数据库的依赖项(无论它是什么)?这样,就不需要模拟 private 方法了。
  • MyResource() 可能被其他类的代码使用,我不想改变他们的行为。
  • 嗯,但是如果它被其他类使用呢?为什么要阻止测试模拟从数据库创建 MyResource 的依赖项?

标签: java unit-testing mocking powermock


【解决方案1】:

不是直接但是,你可以suppress然后用power mockito模拟

    @RunWith(PowerMockRunner.class)
    @PrepareForTest(ToBeTested .class)
    public class TestToBeTested{

    @before
    public void setup(){
      suppress(method(ToBeTested.class, "getResource"));
    }

    @Test
    public void testMethod(){
        doAnswer(new Answer<Void>() {
      @Override
      public MyResource answer(InvocationOnMock invocation) throws Throwable {
           return new MyResource();
      }
 }).when(ToBeTested.class, "getResource");
    }

       ToBeTested mock = mock(ToBeTested.class);
       mock.myMethod();
       //assert
    }

【讨论】:

  • 这段代码有错误。 mock.myMethod(); 需要在函数内部,但不是。
猜你喜欢
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
  • 2015-03-23
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多