Powermock和Mockito - mock被忽略了

时间:2017-07-05 08:32:05

标签: java junit mockito powermock powermockito

我试图将一个孩子模拟注入我的Main.class,它似乎没有用。 (使用带有依赖关系的junit的powermock 1.7.0)

验证说我的模拟对象没有互动。无法弄清楚原因。

这是我的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);
    }
}

1 个答案:

答案 0 :(得分:1)

您在测试中创建的模拟实际上从未使用过,因为每次在其上调用 play()时,Main对象都会创建一个新的Child对象。

您想要的是告诉生产代码使用模拟子实例的方法,例如:通过二传手。

主要

public void play(){
    // child = new Child(); // do not create a new instance each time
    child.setNumber(50);
    System.out.println(child.getNumber());
}

<强> MainTest

@Test
public void testMain(){
    main = new Main();
    main.setChild(child); // tell it to use the mock
    main.play(); 
    Mockito.verify(child).getNumber();
}