我想使用 Espresso 为 Activity 编写功能测试,使用通过 MockRestAdapter ( https://github.com/square/retrofit/blob/master/retrofit-mock/src/main/java/retrofit/MockRestAdapter.java ) 创建的模拟 Retrofit API 服务实例。
但这有点棘手,因为您无法真正通过 Activity 的构造函数注入(inject)任何依赖项。
目前,单个 Retrofit API 服务实例存在于我的 Application 对象中,我在我的每个 Activity 的 onCreate() 方法中创建了一个对它的引用。
如何换入模拟 Retrofit API 服务?也许 Dagger 是答案?
最佳答案
是的,Dagger 就是答案。关于如何实现这一点,我建议查看 Jake Wharton 的 u2020 Github .简而言之,您为生产和调试风格提供不同的 API 实现。或者,您可以对集成测试使用单独的风格。
在没有 Dagger 的情况下解决这个问题的另一种方法(添加对它的支持对于正在进行的项目来说将是一项艰巨的任务),将具有集成测试的风格。例如。具有 release、debug 和 mock 风格。
然后您可以在 Android Manifest 中为 mock 风格设置一个不同的 Application 类 - 一个使用模拟适配器的实现。这里的核心思想是您可以覆盖或扩充您的主要 AndroidManifest 风格。
大致是这样的:
项目结构
app/
src/
main/
AndroidManifest.xml - Activities, services, permissions - all the stuff goes here
java/.../MyApplication.java
mock/
AndroidManifest.xml - example below
java/.../MockApplication.java
debug/ - Not relevant for this example
release/ - Not relevant for this example
main/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.android" >
<!-- Permissions etc -->
<application
android:name=".MyApplication"
...
>
<!-- Activities, services etc -->
</application>
</manifest>
模拟/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:name=".MockApplication"/>
</manifest>
应用程序.java
public class MyApplication extends Application {
@Override public void onCreate(Bundle savedState) {
MyApi api = createApiAdapter();
}
protected MyApi createApiAdapter() {
// Create regular Retrofit adapter
}
}
MockApplication.java
public class MockApplication extends MyApplication {
@Override protected MyApi createApiAdapter() {
// Create mock Retrofit adapter
}
}
build.gradle
android {
// ...
buildTypes {
mock {
applicationIdSuffix '.mock'
versionNameSuffix '-mock'
debuggable true
}
debug {
applicationIdSuffix '.dev'
versionNameSuffix '-dev'
debuggable true
}
release {
signingConfig signingConfigs.release
}
}
}
关于android - 将模拟 Retrofit API 服务实例注入(inject) ActivityInstrumentTestCase2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26445688/
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b