Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Junit 如何使用PowerMock模拟JSONObject_Junit_Easymock_Powermock - Fatal编程技术网

Junit 如何使用PowerMock模拟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" } } 以下

我需要帮助来模拟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();

我不知道如何嘲弄这件事。有什么帮助吗?

从你的问题来看,我不确定你想测试什么,也不确定你真正的问题是什么,但这里有一些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结构吗