如何在junit中模拟静态引用?

时间:2018-04-04 03:36:45

标签: java spring junit mockito powermockito

我在项目中模拟静态成员时遇到了问题。 请在下面找到与我的项目代码类似的示例。

class A {
private String place = null;
    public methodA() {
    this.place = LoadPlaceDao.placeDao.PlaceMap();
    .........
    .........
    .........

    }
}

public class LoadPlaceDao {
public static PlaceDao placeDao;

public LoadPlaceDao() {
    placeDao = new PlaceDaoImpl();
    }
} 

主要目标我的测试只是代码覆盖, 我想模拟 LoadPlaceDao.placeDao.PlaceMap(); 在LoadPlaceDao.placeDao附近获取NullPointerException,因此剩余的行不会覆盖。 PowerMockito仅适用于静态方法。 ** placeDao是静态参考。

1 个答案:

答案 0 :(得分:0)

PowerMock是一个JUnit扩展,它利用EasyMock和Mockito的可能性来模拟静态方法(以及更多)。

我们正在测试的单元是类Calculator,它只是将两个整数委托给MathUtil,它只提供静态方法:

public class Calculator {

   public int add(int a, int b) {
      return MathUtil.addInteger(a, b);
   }
}

public abstract class MathUtil {

   public static final int addInteger(int a, int b) {
      return a + b;
   }

   private MathUtil() {}
}

由于一些不明原因,我们想要模拟MathUtil,因为在我们的测试场景中,添加应该产生比通常更多的其他结果(在现实生活中我们可能会模拟web服务调用或数据库访问)。怎么可能

his be achieved? Have a look at the following test:

@RunWith(PowerMockRunner.class)
@PrepareForTest( MathUtil.class )
public class CalculatorTest {

   /** Unit under test. */
   private Calculator calc;

   @Before public void setUp() {
      calc = new Calculator();

      PowerMockito.mockStatic(MathUtil.class);
      PowerMockito.when(MathUtil.addInteger(1, 1)).thenReturn(0);
      PowerMockito.when(MathUtil.addInteger(2, 2)).thenReturn(1);
   }

   @Test public void shouldCalculateInAStrangeWay() {
      assertEquals(0, calc.add(1, 1) );
      assertEquals(1, calc.add(2, 2) );
   }
}

首先,我们使用PowerMock框架提供的特殊测试运行器。使用@PrepareForTest(MathUtil.class)注释,我们准备了类的模拟。此注释采用要模拟的所有类的列表。在我们的示例中,此列表由单个项MathUtil.class组成。

在我们的设置方法中,我们调用PowerMockito.mockStatic(...)。 (我们可以为方法mockStatic写一个静态导入,但是这样你可以更清楚地看到方法的来源。)

然后我们定义我们的模拟行为,调用PowerMockito.when(...)。在我们的测试中,我们有通常的断言。