Java 使用PowerMockito模拟私有方法
我试图使用PowerMockito模拟一个私有方法 下面给出了示例代码 理想情况下,m2()应该返回“fromspy方法” 我不知道会遗漏什么 请澄清 Sample.javaJava 使用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");
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完全同意。不幸的是,我正在处理遗留代码,此时重构不是一个选项。我发布的代码是演示该问题的示例代码。谢谢你的建议。