如何模拟JSONObject?

时间:2015-11-12 22:39:08

标签: android unit-testing mocking

在方法的中间我正在做这样的事情

JSONObject = new JSONObject(json);

现在我正在尝试使用Android StudioJUnit进行单元测试。不幸的是,Android Studio不会让我创建一个真实的JSONObject实例并让我模仿它。

保留代码并进行单元测试的最简单方法是什么?

Mockito不会帮助我,因为它无法模拟构造函数,但似乎PowerMock是可行的方法。

3 个答案:

答案 0 :(得分:5)

我终于使用了Roboelectric。它允许您运行模拟真实设备条件的测试。这使得模拟框架类没有必要。

只需要将roboelectric引用添加到gradle并使用@RunWith(RobolectricTestRunner.class)

装饰我的测试类

答案 1 :(得分:1)

您可以使用简单代码

创建模拟JSONObject
JSONObject mock = Mockito.mock(JSONObject.class);

然后你可以轻松地模拟它的方法,比如字段getter,以便能够从JSONObject返回你想要的任何内容。

如果问题是这个JSONObject是在long函数的中间创建的,那么你可以将JSONObject创建提取给协作者,然后模拟协作者。

MyClass {
   MyClass(JSONObjectCreator creator) {
      this.creator = creator;
   }
   public void doesSomethingWithJSON(String input) {
      //...
      JSONObject jsonObject = creator.createJSONObject(input);
      //...
   }
}
JSONCreator {
   public JSONObject createJSONObject(String input) {
      return new JSONObject(input);
   }
}

在测试中,您将创建一个模拟JSONObject,以及一个带有模拟JSONObjectCreator的新MyClass。模拟的JSONObjectCreator将返回模拟JSONObject。

答案 2 :(得分:0)

如果您使用 Kotlin 和 Mockk

private val json: JSONObject = mockk(relaxed = true)