gpt4 book ai didi

java - Powermock 和 Mockito - 模拟被忽略

转载 作者:行者123 更新时间:2023-11-30 06:37:47 24 4
gpt4 key购买 nike

我正在尝试将子模拟注入(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com