如何使用PowerMock模拟JSONObject

时间:2014-07-08 17:57:42

标签: junit easymock powermock

我需要帮助来模拟JSONObject。这是我需要做的事情

我需要进行单元测试的方法是

public A changeValues (JSONObject jsonObject){
      // look through JSON
      returns A;
}

JSON看起来像这样

{
   "a" : "some value1",
   "b" : {
        "c" : "some value2",
        "d" : "some value3" 
    }
}

以下是我的尝试:

JSONObject jsonObject = createMock(JSONObject.class);
// I am stuck here
expects(json.opt(),"value").anyTimes();
expects(json.optJSONArray,[array]).anyTimes();

我不知道如何嘲笑这个。有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

从您的问题来看,我不确定您尝试测试的内容或您发布的内容是什么,但此处有一些 EasyMock-101 提示如何一切正常。如果这一切都为您所知,我道歉。


要创建类的新模拟实例,请使用:

EasyMock.createMock( JSONObject.class );

这为JSONObject类创建了一个新的模拟对象。此对象当前处于<​​em>记录模式。这意味着对mock的任何方法调用都将被归类为对这些方法调用的期望,并在调用时返回null。

然后设置您的期望,您可以使用以下方法:

EasyMock.expect( mockJsonObject.opt("a") ).andReturn( "value" ); //Expectation 1

mockJsonObject.testValidity(null) //Expectation 2
EasyMock.expectLastCall();

期望1设置了一个期望,opt方法将使用参数"a"调用,然后它将返回"value"

Expectation 2设置了一个期望,即使用null对象调用testValidity方法。因为它是一个void方法,所以没有返回类型,expectLastCall()方法用于将方法调用标记为期望。

然后,您可以使用EasyMock.replay()将对象移动到重播模式。在这种模式下,对模拟对象的任何方法调用都将由期望处理。如果您希望拨打opt,然后拨打opt,则会返回您设置的返回值。

一旦您测试了所需内容,就应该验证期望是否已经发生。使用EasyMock.verify()方法会发生这种情况。

因此,一般的EasyMock测试如下:

public void thatEasyMockCanMockJsonObject() {
    JSONObject mockJsonObject = EasyMock.createMock(JSONObject.class);
    EasyMock.expect( mockJsonObject.opt( "a" ) ).andReturn( "value" );
    EasyMock.replay( mockJsonObject );

    changeValues( mockJsonObject );

    EasyMock.verify( mockJsonObject );
}

有关EasyMock和PowerMock的更多高级说明

EasyMock通过扩展模拟类并覆盖预期的方法来创建它的模拟和模拟方法。因此,不能使用EasyMock模拟final,private,package或static方法和类。话虽如此,JSONObject不是这些东西,所以应该可以用EasyMock来模拟它。

JavaDoc for JSONObject的外观来看,你需要PowerMock的唯一原因是你是否期望调用任何静态方法。如果你不是,那么你可以使用EasyMock。

如果您正在尝试模拟静态方法,那么PowerMock可以与EasyMock一起使用。 Here is the documentation for mocking static methods with PowerMock. 主要观点如下:

  

模拟静态方法

     

快速摘要

     
      
  1. 在测试用例的类级别使用@RunWith(PowerMockRunner.class)注释。

  2.   
  3. 在测试用例的类级别使用@PrepareForTest(ClassThatContainsStaticMethod.class)注释。

  4.   
  5. 使用PowerMock.mockStatic(ClassThatContainsStaticMethod.class)来模拟此类的所有方法。

  6.   
  7. 使用PowerMock.replay(ClassThatContainsStaticMethod.class)将类更改为重播模式。

  8.   
  9. 使用PowerMock.verify(ClassThatContainsStaticMethod.class)将类更改为验证模式。

  10.