2

我已经使用 PowerMock/Mockito 模拟了私有方法,现在我的问题是如何访问在此方法中声明的对象?

例如 。

private void method1()
{
MyObject ob = new MyObject();

}

现在在我的测试代码中,我想访问 ob 对象来验证值。

4

1 回答 1

2

本指南详细介绍了使用 PowerMock 模拟构造函数调用:

...但是使用 PowerMock 您不必更改代码,而是可以指示 PowerMock 拦截对 new File(..) 的调用并返回一个模拟对象。为此,我们首先像往常一样创建一个 File.class 类型的模拟:

File fileMock = createMock(File.class);

为了期待对新文件的调用,我们只需执行以下操作:

expectNew(File.class, "directoryPath").andReturn(fileMock);

所以在你的情况下,你应该在你的测试用例或设置方法中有这些:

MyObject mockOb = createMock(MyObject.class);
expectNew(MyObject.class).andReturn(mockOb);

通过添加这些,您将具有以下行为:

每当您的代码new MyObject()中有一个由测试用例运行时,PowerMock 模拟的对象实例就会被返回。因此,无论您在代码中的哪个位置创建一个新实例,它都将与函数创建的实例完全相同。MyObjectcreateMock()

编辑

让我们举个例子

Class A { 
 private void method1() 
 { 
   Obj obj = new Obj(); 
    obj.setX(10);
 } 
 //Here I want to access the obj object to verify the values 
}

要做到这一点,你必须有一些不同的想法。

  1. 创建真实的A实例
  2. 为 Obj 构造函数设置模拟
  3. 运行你的触发逻辑pruivate method1()
  4. 检查模拟的 Obj 实例上的值
    • 如果这些值不可测试(在逻辑中对其进行了修改),zou 可以检查 setX() 是否在适当的时间被调用。

这些方面的东西:

@Test
public void testMyPrivateMethod() {
    //1. object with the logic to test
    A a = new A();

    //2. set up mocking
    Obj mockObj = createMock(Obj.class);
    expectNew(Obj.class).andReturn(mockObj);

    //3. trigger logic to test
    a.someOtherMethodThatCallsMethod1();

    //4. test Obj (find out if setX() has been called or not)
    verify(mockObj).setX(any(Integer.class));
}
于 2013-03-19T12:48:07.200 回答