如何访问私有方法内的对象?

时间:2013-03-19 12:44:53

标签: java unit-testing junit mockito powermock

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

例如。

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

}

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

1 个答案:

答案 0 :(得分:1)

This guide详细说明使用PowerMock模拟构造函数调用:

  

...   但是使用PowerMock,您不必更改代码,而是可以指示PowerMock拦截对新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模拟的对象实例。因此,在您的代码中 where 创建一个新的MyObject实例并不重要,它将与createMock()函数创建的实例完全相同。

修改

  

让我们举个例子

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. 创建真实的实例
  2. 为Obj构造函数设置模拟
  3. 运行触发pruivate method1()
  4. 的逻辑
  5. 检查模拟的Obj实例上的值
    • 如果值不可测试(在逻辑中修改了某些值),则可以检查setX()是否被调用了适当的时间。
  6. 这些方面的东西:

    @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));
    }