我在项目中模拟静态成员时遇到了问题。 请在下面找到与我的项目代码类似的示例。
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是静态参考。
答案 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(...)。在我们的测试中,我们有通常的断言。