我需要帮助来模拟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();
我不知道如何嘲笑这个。有什么帮助吗?
答案 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. 主要观点如下:
模拟静态方法
快速摘要
在测试用例的类级别使用@RunWith(PowerMockRunner.class)注释。
在测试用例的类级别使用@PrepareForTest(ClassThatContainsStaticMethod.class)注释。
使用PowerMock.mockStatic(ClassThatContainsStaticMethod.class)来模拟此类的所有方法。
使用PowerMock.replay(ClassThatContainsStaticMethod.class)将类更改为重播模式。
- 醇>
使用PowerMock.verify(ClassThatContainsStaticMethod.class)将类更改为验证模式。