我正在尝试将子模拟注入(inject)到我的 Main.class 中,但它似乎不起作用。 (使用 powermock 1.7.0 和 junit 捆绑依赖项)
验证表明我的模拟对象没有交互。不明白为什么。
这是我的 Main.class:
public class Main {
private Child child;
public Main(){ }
public void setChild(Child child){
this.child = child;
}
public void play(){
child = new Child();
child.setNumber(50);
System.out.println(child.getNumber());
}
}
这是我的 Child.class:
public class Child {
private int number;
public void setNumber(int number){
this.number = number;
}
public int getNumber(){
return number;
}
}
这是我的 Test.class:
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.when;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest({Child.class, Main.class})
public class MainTest {
private Child child;
private Main main;
@Test
public void testMain(){
main = new Main();
main.play();
Mockito.verify(child).getNumber();
}
@Before
public void setup(){
child = mock(Child.class);
when(child.getNumber()).thenReturn(10);
}
}
最佳答案
您在测试中创建的模拟从未实际使用过,因为每次您调用 Play() 时,Main 对象都会创建一个新的 Child 对象。
您想要的是一种告诉生产代码使用模拟子实例的方法,例如通过 setter 。
主要
public void play(){
// child = new Child(); // do not create a new instance each time
child.setNumber(50);
System.out.println(child.getNumber());
}
主要测试
@Test
public void testMain(){
main = new Main();
main.setChild(child); // tell it to use the mock
main.play();
Mockito.verify(child).getNumber();
}
关于java - Powermock 和 Mockito - 模拟被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44920911/