Junit 如何使用PowerMock模拟JSONObject
我需要帮助来模拟JSONObject。这是我需要做的 我需要的单元测试方法是Junit 如何使用PowerMock模拟JSONObject,junit,easymock,powermock,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" } } 以下
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();
我不知道如何嘲弄这件事。有什么帮助吗?从你的问题来看,我不确定你想测试什么,也不确定你真正的问题是什么,但这里有一些EasyMock-101关于如何工作的提示。如果你知道这些,我道歉
要创建类的新模拟实例,请使用:
EasyMock.createMock( JSONObject.class );
这为JSONObject类创建了一个新的模拟对象。此对象当前处于记录模式。这意味着对mock的任何方法调用都将被归类为这些方法调用的期望值,并在调用时返回null
然后,使用以下方法设定期望值:
EasyMock.expect( mockJsonObject.opt("a") ).andReturn( "value" ); //Expectation 1
mockJsonObject.testValidity(null) //Expectation 2
EasyMock.expectLastCall();
期望值1设置一个期望值,即使用参数“a”
调用opt
方法,然后返回“value”
期望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通过扩展mock类并重写预期的方法来创建它的mock和mock方法。因此,不能用EasyMock模拟final、private、package或静态方法和类。话虽如此,JSONObject不是这些东西中的任何一个,所以应该可以用EasyMock来模拟它
从外观上看,您需要PowerMock的唯一原因是您希望调用任何静态方法。如果你不是,那么你可以用EasyMock
如果您试图模拟静态方法,那么PowerMock可以与EasyMock一起使用。要点如下:
模拟静态方法
快速总结
在测试用例的类级别使用@RunWith(PowerMockRunner.class)注释
在测试用例的类级别使用@PrepareForTest(包含StaticMethod.class的类)注释
使用PowerMock.mockStatic(包含StaticMethod.class的类)来模拟此类的所有方法
使用PowerMock.replay(包含StaticMethod.class的类)将类更改为replay模式
使用PowerMock.verify(包含StaticMethod.class的类)将类更改为验证模式
我不知道你到底想做什么。是否要用模拟对象替换JSON对象?或者你想模仿一种方法还是什么?你打算在这里测试什么?我需要对上面的方法进行单元测试。将要传递给该方法的JSON就是我放在那里的JSON。这就是需要发送到该方法的模拟JSONObject。我不能做的是创建一个模拟的JSONObject。我不明白为什么要在测试(算法?内部)方法时模拟JSONObject。为什么不在测试时传递一个创建的JSON对象呢?返回A的确切作用是什么,这意味着什么是“A”?我肯定可以发送一个我可以在外部创建的JSONObject。但是按照Powermock/EasyMock的方式,我想在iti上使用expects()->replay&verify,但我遇到了同样的问题。您能解释一下如何创建模拟json结构吗