【问题标题】:How to mock each and every instance of a class如何模拟一个类的每个实例
【发布时间】:2015-09-22 16:35:47
【问题描述】:

我想以这样一种方式模拟我的 java 类,以便它的每个新实例都应该返回模拟的响应。

【问题讨论】:

  • 你可以将这个类命名为 AlwaysMocked
  • 也许你应该用 getInstance() 方法创建一个工厂类,并从这个方法返回一个模拟对象。不要调用 new,而是调用 getInstance(),它总是会返回一个模拟对象。

标签: java mocking powermock easymock


【解决方案1】:

有两个模拟库支持这一点:PowerMock(如 Matthias 的回答所示)和 JMockit。

第二种情况,测试只需要使用@Mocked注解声明一个mock字段或mock参数即可。

【讨论】:

  • 我不熟悉JMockit,但我希望在已声明的模拟字段上使用@Mocked,将创建一个分配给该字段的模拟实例。如果它会“拦截”一个调用 new MyOriginalClass() 来创建一个模拟对象,那将是令人惊讶的。
  • @MatthiasJ.Sax 一旦一个类是@Mocked,它的所有实例都会被模拟;就那么简单。为记录和/或验证期望的目的,创建并分配给模拟字段(或测试方法参数)的实例是所有此类实例的代表。因此,new MyOriginalClass() 构造函数的执行确实会被“拦截”,但 模拟实例本身,无需创建另一个。
  • 有趣。感谢您的澄清!
【解决方案2】:

基本上是:

PowerMockito.whenNew(MyOriginalClass.class).withNoArguments().thenReturn(new MyMockClass());

您还需要使用@RunWith(PowerMockRunner.class) @PrepareForTest(ClassThatCallsConstructorOfMyOriginalClass.class) 作为JUnit 测试类的类注解。如果您有多个实例化 MyOriinalClass 的类,您还可以指定整个包:@PrepareForTest("com.mypackage.*")

【讨论】:

    猜你喜欢
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 2014-02-26
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多