Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.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 使用PowerMockito模拟私有方法_Java_Unit Testing_Powermockito - Fatal编程技术网

Java 使用PowerMockito模拟私有方法

Java 使用PowerMockito模拟私有方法,java,unit-testing,powermockito,Java,Unit Testing,Powermockito,我试图使用PowerMockito模拟一个私有方法 下面给出了示例代码 理想情况下,m2()应该返回“fromspy方法” 我不知道会遗漏什么 请澄清 Sample.java import java.io.IOException; public class Sample { public void m1(String input) throws IOException { System.out.println("Sample.m1() BEGIN");

我试图使用PowerMockito模拟一个私有方法

下面给出了示例代码

理想情况下,m2()应该返回“fromspy方法”

我不知道会遗漏什么

请澄清

Sample.java

import java.io.IOException;

public class Sample {

    public void m1(String input) throws IOException {
        System.out.println("Sample.m1() BEGIN");
        String r = m2(input);
        System.out.println("Sample.m1() END--> " + r);
    }

    private String m2(String s) {
        System.out.println("Sample.m2()" + s);
        return "From m2 method";
    }

}
import static org.mockito.Matchers.anyString;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest({ Sample.class })
public class SampleTest {

    @Test
    public void testM1() throws Exception {
        Sample spy = PowerMockito.spy(new Sample());
        PowerMockito.doReturn("from spy method").when(spy, "m2", anyString());

        Sample sample = new Sample();
        sample.m1("Hi m1!!!");
    }
}
SampleTest.java

import java.io.IOException;

public class Sample {

    public void m1(String input) throws IOException {
        System.out.println("Sample.m1() BEGIN");
        String r = m2(input);
        System.out.println("Sample.m1() END--> " + r);
    }

    private String m2(String s) {
        System.out.println("Sample.m2()" + s);
        return "From m2 method";
    }

}
import static org.mockito.Matchers.anyString;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest({ Sample.class })
public class SampleTest {

    @Test
    public void testM1() throws Exception {
        Sample spy = PowerMockito.spy(new Sample());
        PowerMockito.doReturn("from spy method").when(spy, "m2", anyString());

        Sample sample = new Sample();
        sample.m1("Hi m1!!!");
    }
}
输出

Sample.m1() BEGIN
Sample.m2()Hi m1!!!
Sample.m1() END--> From m2 method
我需要对spy实例而不是示例实例调用m1()。 谢谢你的建议

修改代码:

@Test
    public void testM1() throws Exception {
        Sample spy = PowerMockito.spy(new Sample());
        PowerMockito.doReturn("from spy method").when(spy, "m2", anyString());

        spy.m1("Hi m1!!!");
    }

我不知道PowerMockito,但是搜索一个例子,比如,表明您应该执行
spy.m1(“Hi m1!!!”)
而不是创建一个新实例……所以,您有一些代码是无法模拟的,它有一些副作用,您不容易观察到(您需要以某种方式捕获System.out)?我建议您考虑重新设计代码以实现可测试性。@AndyTurner完全同意。不幸的是,我正在处理遗留代码,此时重构不是一个选项。我发布的代码是演示该问题的示例代码。谢谢你的建议。