我如何在Android应用程序中模拟REST后端

时间:2015-08-14 08:51:44

标签: android android-volley

我的Android应用程序通过REST API与后端服务进行通信。我想嘲笑这个API来快速开发前端。 我使用android volley作为客户端网络库。

2 个答案:

答案 0 :(得分:7)

您可以使用dependency injection设计模式。

基本上,您指定的接口定义了一组与REST后端中的查询相对应的方法,例如:

interface DataSupplier {
    // Lookup user by ID
    User getUser(int id);

    // Get all blog posts posted by a specific user.
    List<BlogPost> getUsersBlogPosts(int userId);
}

现在,在需要查询后端的类中,指定一个注入器。这可以通过多种方式完成(例如构造函数注入,setter注入 - 有关更多详细信息,请参阅wiki文章)。使用注入器可以将依赖项的实现注入依赖于它的类中。我们假设您使用构造函数注入。使用后端的类看起来像这样:

public class DependentClass {

    private final DataSupplier mSupplier;

    public DependentClass(DataSupplier dataSupplier) {
        mSupplier = dataSupplier;
    }

    // Now you simply call mSupplier whenever you need to query the mock
    // (or - later in development - the real) REST service, e.g.:
    public void printUserName() {
        System.out.println("User name: " + mSupplier.getUser(42).getName());
    }
}

然后创建DataSupplier的模拟实现:

public class MockRestService implements DataSupplier {

    @Override
    public User getUser(int id) {
        // Return a dummy user that matches the given ID
        // with 'Alice' as the username.
        return new User(id, "Alice");
    }

    @Override
    public List<BlogPost> getUsersBlogPosts(int userId) {
        List<BlogPost> result = new ArrayList<BlogPost>();
        result.add(new BlogPost("Some Title", "Some body text"));
        result.add(new BlogPost("Another Title", "Another body text"));
        result.add(new BlogPost("A Third Title", "A third body text"));
        return result;
    }
}

并使用它来实例化您的依赖类:

DepedentClass restClient = new DepedentClass(new MockRestService());

现在您可以使用restClient,因为它已连接到您的实际后端。它只会返回可用于开发前端的虚拟对象。

当您完成前端并准备好实现后端时,您可以通过创建DataSupplier的另一个实现来实现此目的,该实现设置与REST后端的连接并查询它以查找真实对象。我们假设您将此实现命名为RestService。现在,您可以使用MockRestService构造函数替换创建RestService的构造函数,如下所示:

DepedentClass restClient = new DepedentClass(new RestService());

而且你拥有它:通过交换单个构造函数,您可以将前端代码从使用虚拟对象更改为使用真正的REST交付对象。 您甚至可以根据应用程序的状态(调试或发布)创建调试标志并创建restClient

boolean debug = true;
DependentClass restClient = null;
if (debug) {
    restClient = new DepedentClass(new MockRestService());
} else {
    restClient = new DepedentClass(new RestService());
}

答案 1 :(得分:1)

我最近创建了RESTMock。它是一个用于在Android测试中模拟REST API的库。它可以在开发过程中使用。您需要在github上的README之后进行设置,并创建一个基本的Android Instrumentation测试,它将启动您的应用程序并且不执行任何操作。这样,应用程序就可以在后台使用模拟服务器启动。

示例测试:

public class SmokeTest {
    @Rule public ActivityTestRule<MainActivity> rule = new ActivityTestRule<MainActivity>(
            SplashActivity.class,
            true,
            false);


    @Test
    public void smokeTest() throws InterruptedException {
        rule.launchActivity(null);
        Thread.sleep(10000000);
    }
}