【问题标题】:Use Easy Mock Objects使用简单的模拟对象
【发布时间】:2013-10-22 04:32:05
【问题描述】:

我正在做一个 Junit 测试,我需要同时处理 Easymock 和 Class 对象来进行测试。

下面是我的代码sn-p

@Before
public void setUp() {
    request=EasyMock.createMock(SlingHttpServletRequest.class);
    response=EasyMock.createMock(SlingHttpServletResponse.class);

}

@Test
public void testImage() {

RequestContext ctx = new RequestContext();  

// RequestContext and RequestContext Util are both classes defined in Project

    expect(RequestContextUtil.setupContext(request,response)).andReturn(ctx);

    // This line is throwing an error , so I am not able to add replay or verify method

}

我尝试查看一个可以同时使用 Easy mock 和 Class 对象的示例,但我找不到适合我的情况。谁能给我举个例子?

【问题讨论】:

  • 您尝试执行的操作不起作用,因为您的代码不使用模拟,而是调用无法模拟的静态方法(因为它没有在模拟上调用)。如果您提供更多背景信息以及您想要测试的内容和方式,也许有人可以帮助您找到解决方法。
  • 我有一个 Util 类,它存储应用程序的请求上下文和其他相关的属性集。 Util 类使用 slingrequest 和 sling response 对象。我正在尝试在这个 Util 类(它的方法之一)上创建一个 junit 测试。
  • 好吧,如果没有看到整个代码,很难给您任何建议,但您可能不得不停止使用模拟并正确设置所有内容,或者重构您的代码库以便使用模拟。
  • 我想如果简单的模拟不能提供这样的东西,那么我可能不得不重新考虑
  • 嗯,有一些方法可以解决这个问题,但是当我在 SO 上提到 PowerMock 时,我总是觉得很脏:code.google.com/p/powermock/wiki/MockStatic 这不是一个好习惯,你应该对使用 PM 感到难过 :-)

标签: java unit-testing junit easymock


【解决方案1】:
private MockHttpServletRequest request;
private MockHttpServletResponse response;

 @Before
 public void setup() {
    request = new MockHttpServletRequest();
    response = new MockHttpServletResponse();
}

    @Test
    public void testImage() {
      //here you don't need to `expect` or `reply` 

     // `request` and `response` is mock now. 
   }

【讨论】:

    【解决方案2】:

    您不能使用 EasyMock 模拟静态方法调用。 2个解决方案:

    • 将静态调用提取到 SUT 中的不同方法并测试 SUT 的部分模拟版本(仅模拟完成静态调用的新方法)。 Partial mocks using easymock
    • 如上所述,使用 PowerMock 并直接模拟静态调用。

    【讨论】:

      猜你喜欢
      • 2012-11-08
      • 2016-08-08
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多