Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何访问私有方法中的对象?_Java_Unit Testing_Junit_Mockito_Powermock - Fatal编程技术网

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

Java 如何访问私有方法中的对象?,java,unit-testing,junit,mockito,powermock,Java,Unit Testing,Junit,Mockito,Powermock,我已经使用PowerMock/Mockito模拟了私有方法,现在我的问题是如何访问该方法中声明的对象 比如说 private void method1() { MyObject ob = new MyObject(); } 现在,在我的测试代码中,我想访问ob对象以验证值。使用PowerMock模拟构造函数调用的详细信息: 。。。 但是使用PowerMock,您不必更改代码,相反,您可以指示PowerMock拦截对新文件(..)的调用,并返回一个模拟对象。为此,我们首先像往常一样创建File

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

比如说

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

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

使用PowerMock模拟构造函数调用的详细信息:

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

File fileMock = createMock(File.class);
要期望调用新文件,我们只需执行以下操作:

expectNew(File.class, "directoryPath").andReturn(fileMock);
因此,在您的情况下,您应该在您的测试用例或设置方法中包含以下内容:

MyObject mockOb = createMock(MyObject.class);
expectNew(MyObject.class).andReturn(mockOb);
通过添加这些,您将具有以下行为:

只要测试用例运行的
代码中有
新的MyObject()
,就会返回PowerMock模拟的对象实例。因此,在代码中的何处创建新的
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 
}
要做到这一点,你必须有点不同的想法

  • 创建一个真实的实例
  • 为Obj构造函数设置模拟
  • 运行触发
    pruivate method1()
  • 检查模拟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));
    }
    

    我不确定,但我记得我看到了一种方法,以某种方式模拟构造函数调用,并使其返回一个模拟对象,可以在以后进行检查。您可以提供一些您试图实现的精确信息。因为在我看来,如果您想检查私有方法的内部字段,您似乎没有使用正确的方法。@ppeterka:我不想修改code@user2181531您不想修改测试代码吗?你想要测试的原始代码不必被我建议的修改…@ppeterka:你说的是创建一个返回模拟对象,我假设需要测试的代码应该被修改。我的不是构造函数。让我们以类a{private void method1(){Obj Obj=new Obj();Obj.setX(10);}为例,这里我想访问Obj对象以验证值。当mockinglet以类a{private void method1(){Obj Obj=new Obj();Obj.setX(10);}为例时,我的方法不会返回与您创建的相同的对象在这里,我想访问obj对象来验证值。你的方法的返回类型是
    void
    。它不返回任何东西。我不明白你写了什么…你明白模拟是如何工作的吗?这就是我试图告诉你的,我知道,我能够模拟这个方法,我能够进入这个方法,唯一的事情就是这样s对象保存在数据库中,在测试级别,我没有数据库,我也不想补录,所以我想访问这个对象,它位于私有方法中。您编辑的内容看起来像在轨道上回答我…让我看看我是否可以遵循它