【问题标题】:Testing class with Protected Constructor w/ PowerMock and Mockito使用 PowerMock 和 Mockito 的受保护构造函数测试类
【发布时间】: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


【解决方案1】:

您不需要为此使用 PowerMock;一个 Mockito 模拟就可以了。但通常,模拟在其方法中没有任何功能,这就是 toStrings() 没有返回您期望的值的原因。要更改此设置,您需要 CALLS_REAL_METHODS 默认答案。

所以我的建议是将创建模拟的行(testToStrings 的第三个非空行)更改为类似的内容。

Challenge challengeMock = Mockito.mock(Challenge.class, Mockito.CALLS_REAL_METHODS );

我已经对此进行了测试,如果您进行此更改,您的测试通过。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2010-11-08
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 2018-06-15
    相关资源
    最近更新 更多