3

使用 Mockito 我想模拟一个类的属性,以便验证输出

public class MyClass extends ThirdPartyFramework {
  Output goesHere;

  @Override
  protected setup(){
    goesHere = new Output();
  }

  //...      
}

public abstract class ThirdPartyFramework {
  protected setup(){...}
  //...
}

我需要注入 Output 类的模拟,以便我可以验证我的代码是否编写了正确的输出。

  • 但我不能仅仅@InjectMock因为该setup()方法在运行时被调用并覆盖了我的注入。

  • 而且我不能只公开设置,MyClass因为我正在使用的测试代码是通用的,需要适用于 的所有子类 ThirdPartyFramework,所以我只有一个参考ThirdPartyFramework,意思setup()是受保护。

4

3 回答 3

1

你准备好 Mockito 了吗?我在问,因为Mockito FAQ Mockito FAQ 声明它不支持模拟静态方法,我想在这种情况下你需要设置方法来创建你的模拟而不是真正的输出。

我在类似的场景中使用过 PowerMock:

whenNew(NewInstanceClass.class).withArguments(any()).thenReturn(mockObject);

这表示每次创建 NewInstanceClass 时都会返回我的 mockObject,无论使用了什么构造函数参数以及谁在什么时间构造了 NewInstanceClass。

在 PowerMock 文档中,我还找到了以下示例:

PowerMock.expectNew(NewInstanceClass.class).andReturn(mockObject)

实际上,即使您绑定到 Mockito,您也可以使用它,PowerMock 包含 Mockito的帮助程序来解决这个问题,让您可以使用 Mockito 进行所有测试,并使用 PowerMock 来模拟构造对象。像这样:

whenNew(Output.class).withNoArguments().thenReturn(yourOutputMock);
于 2013-01-31T14:49:14.137 回答
1

我最终通过ThirdPartyFramework将该类包装并放置在与该类相同的包中来解决这个问题ThirdPartyFramework

这样我就可以用 Mockito 模拟受保护的方法。然后我可以@InjectMock用来注入Output对象的模拟并通过该模拟控制其方法调用。

于 2013-01-31T17:22:44.467 回答
0

如何为“goesHere”添加一个设置器,然后让 setup() 检查并仅在 goesHere 为 null 时更改其值。这样你就可以在测试中注入一个不会被覆盖的值。就像是:

protected void setGoesHere( Output output ){
    goesHere = output;
} 

@Override
protected void setup(){
    if(goesHere != null) goesHere = new Output();
}

希望这可以帮助。

于 2013-01-31T14:40:49.133 回答