java - Powermock 和 Mockito - 模拟被忽略

标签 java junit mockito powermock powermockito

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

相关文章:

jsf - 使用 PowerMock 分析 JUnit 测试?

java - JUnit with Kotlin - 此类没有构造函数

java - 我们如何使用mockito来获取对象

JAVA 单独的类方法不增加我的主类方法中的变量

java - 获取返回 ArrayList<String[]> 的函数的值

java - 如何在 hibernate 中根据 id 更新行

java - 如何在 Mockito JUnit 中对 setter 方法进行单元测试

java - 使用 PowerMock 和 Mockito 模拟静态方法

java - 单元测试抛出默认管理员用户名不可用错误

java - SQLite 在按下按钮时导致崩溃