目前我正在开发Android应用程序。此应用程序使用的数据由Web服务器提供。现在我想测试应用程序并使用测试数据对其进行一些操作,导致来自服务器的真实数据动态变化,并且我并不总是能够测试特定功能或查看特定内容。我想到的两个选择是:
将测试数据存储在本地数据库/文件中。添加一个全局变量,如 boolean useTestData ,并更改Web服务器连接器,以便在 useTestData 设置为true时不接触Web服务器。缺点是,我必须使用代码修改所有连接器,这些连接器不会在发布的应用程序中使用。
实现第二个Web服务器API用于测试目的,它将仅提供我需要的静态测试数据。如果全局变量设置为true,则将访问测试API。
我认为第二种方式是更好的选择。也许还有其他一些替代方法吗?你怎么看待这个?
提前致谢。
答案 0 :(得分:0)
我在这里看到的最好方法是进行依赖注入。你的建议有什么问题(简要):
您将破坏连接器的逻辑。连接器不能依赖于您的测试。
您正在思考正确的方向,但如果您失去连接或服务器崩溃,您会怎么做?这种方法使您的测试有点不稳定。测试结果将取决于运行测试的计算机的服务器和网络连接的状态,也可能取决于其他内容。那是错的。如果您的代码编写得很好,测试必须始终成功,我的意思是不管其他什么代码。
所以我建议从连接器中抽象出来。
public interface IConnector {
// e.g.
public JSONObject getData(String what);
}
public class Connector implements IConnector {
public JSONObject getData(String what) {
// actual implementation that is already written
// here you make requests to server and so forth
}
}
// mock implementation of your api
public class TestConnector implements IConnector {
public JSONObject getData(String what) {
// predictable behaviour without requests to server
}
}
public class MyActivity extends Activity {
public IConnector connector = new Connector();
/**
* This method substitutes implementation of connector.
* Use this for testing purposes.
*/
public void setConnector(IConnector impl) {
connector = impl;
}
//rest of the code...
}
然后,您将在测试中获得可预测和威慑行为,而无需对代码进行大量更改。
顺便说一句,我听说过Dagger。这是依赖注入的库,应该在这种情况下有所帮助。但是我没有时间去尝试,所以不能说出明确的信息。
希望这对你有帮助。