【发布时间】:2012-03-25 16:36:18
【问题描述】:
我有以下课程要测试:
public abstract class Challenge {
protected int id;
protected String name;
protected String question;
protected Challenge(){}
public String[] toStrings(){
String[] s = {Integer.toString(id), name, question};
return s;
}
...
但是使用这个测试:
@Test
public void testToStrings() throws Exception{
String[] expectedResult1 = new String[]{"1", "a", "b"};
String[] obtainedResult1 = null;
Challenge challengeMock = PowerMockito.mock(Challenge.class);
challengeMock.id = 1;
challengeMock.name = "a";
challengeMock.question = "b";
obtainedResult1 = challengeMock.toStrings();
Assert.assertEquals(expectedResult1[0], obtainedResult1[0]);
Assert.assertEquals(expectedResult1[1], obtainedResult1[1]);
Assert.assertEquals(expectedResult1[2], obtainedResult1[2]);
}
由于“obtainedResult1 = challengeMock.toStrings();”,我得到了 NullPointerException返回 null。
我使用在 Robolectric 中运行的 PowerMock + Mockito 和规则(因为它是一个 Android 项目)。
@Rule
public PowerMockRule rule = new PowerMockRule();
问题出在哪里?
【问题讨论】:
-
你为什么要模拟被测类?也许您想使用 PowerMockito.spy() 或尝试创建 Challenge 的(匿名)实现。
-
我嘲笑它只是因为使用私有构造函数和设置私有数据更容易。间谍使用的任何提示,也许是一个例子?
-
仅供参考,尽管 David 似乎已经回答了您的问题:间谍类似于模拟,但通常用于模拟或检查实际 CUT 的某些行为。您可以像模拟 (Mockito.spy(CUT.class)) 或注释一样使用它。 PowerMockito 提供了一种等效的方法。我倾向于根本不使用 powermock,因为我通常发现它的必要性是糟糕设计的标志,即不可测试性。但这是个人品味。
-
感谢您的建议。我只使用 powermock,因为我有几个静态最终方法和抽象类,所以我也可以测试它们。顺便说一句,我的最后期限非常接近,所以使用 real_method 的解决方案更快。对于下一个项目,我肯定会更好地学习测试和使用 spy。
标签: java testing mockito powermock robolectric