我最近开始使用Android Studio和gradle进行Android开发,并且发现它比eclipse/ant或maven更好.但是我最近开始尝试使用我的应用程序实现某种单元和/或集成测试.我能够使用谷歌最近发布的Espresso框架进行基本测试.我有一些测试,但我需要模拟和注入模拟的对象版本.我过去用过匕首换另一个项目,所以我把匕首放进了我的项目.但是现在我的测试因为以下错误而无法运行:
gradle connectedCheck
Run Code Online (Sandbox Code Playgroud)
...
4.1.2失败:由于'java.lang.IllegalAccessError'导致检测运行失败:EspressoApp:connectedCheck
我在这里创建了一个简单的演示:https: //github.com/mwolfe38/android-espresso-dagger
只需克隆然后从命令行运行:gradle connectedCheck
在上面我已经尝试了几种不同的依赖方式,最初是这样的:
dependencies {
compile 'com.android.support:appcompat-v7:+'
compile 'com.squareup.dagger:dagger-compiler:1.1.0'
compile 'com.squareup.dagger:dagger:1.1.0'
instrumentTestCompile files('libs/espresso-1.0-SNAPSHOT.jar',
'libs/testrunner-1.0-SNAPSHOT.jar',
'libs/testrunner-runtime-1.0-SNAPSHOT.jar')
instrumentTestCompile 'org.hamcrest:hamcrest-all:1.3'
instrumentTestCompile 'com.google.guava:guava:15.0'
}
Run Code Online (Sandbox Code Playgroud)
但这给了我一个关于静态初始化的错误.这似乎是由espresso框架中关于匕首的一些静态初始化代码引起的.因此,在向instrumentTestCompile添加dagger依赖项之后,我得到了上面提到的IllegalAccessError.
任何人都有运气,包括你的项目中的匕首和做咖啡测试?
android android-testing android-gradle-plugin android-espresso
我有一个bugsense帐户,我用它来跟踪我公司的Android应用程序的崩溃报告.我们的应用程序需要安装单独的应用程序(即服务),否则应用程序将无法运行.我们通过检查是否安装了其他应用程序(服务)来处理这个问题,如果没有,我们将用户引导到可以安装应用程序的maket页面,我们这样做:
Intent market = new Intent(Intent.ACTION_VIEW,
Uri.parse("market://details?id=com.mycompany.appname"));
Run Code Online (Sandbox Code Playgroud)
startActivityForResult(market,REQUEST_INSTALL_APK);
偶尔我收到一条错误信息:
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=market://details?id=com.mycompany.appname }
Run Code Online (Sandbox Code Playgroud)
我看到这次发生的最后一次是来自一个三星星系玩家,我们有一些在家里,他们总是为我们工作得很好.有谁知道为什么在某些情况下会发生这种情况?我还没有听到客户的任何抱怨,但似乎这可能是一个问题.
我认为用户可能已经根植了手机并卸载了游戏商店,但我非常怀疑(我们的客户是警察和非技术人员).我想知道手机上是否有设置或其他东西可能会导致无法正常工作?或者他们可能有一个旧版本的市场尚未升级,它不支持我用来指导用户进入市场/游戏商店的方法.
另请注意,我们现在只在Play商店中发布此应用程序,此崩溃所来自的版本是最新版本,除了游戏商店之外,它绝对没有进入公众.根据崩溃报告中IP地址的IPO IP,公司内部的任何人都没有在市场上分发的应用程序副本(只有3个人).这不是一个游戏或普通用户可能会使用的任何东西,但是出于特定目的,所以它不是一些脚本小子和黑客会在地下站点上玩的游戏.
好吧我在一个Android项目上从ant切换到maven,并想知道以下是否易于实现:
目前我有一个自定义build.xml脚本,它有几个用于创建发布版本的目标.它们中的每一个都用于构建应用程序以针对不同的服务器URL运行,其中服务器可以是开发,生产,登台,甚至是我们在其他国家/地区的部署服务器.
原因是我们的应用程序将针对几个不同的服务器运行,具体取决于谁获取它,我不希望它是用户选择的东西.相反,它应该硬编码到应用程序中,这是它当前的工作方式.
这很容易在ant中设置,我只是从[env] .properties文件中获取值,然后在res/values/config.xml中替换server_url字符串.例如:
ant release-prod
Run Code Online (Sandbox Code Playgroud)
会拉读取名为prod.properties的文件,该文件定义了server_url的内容.我将config.xml文件存储在config/config.xml中,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="config_server_url">@CONFIG.SERVER_URL@</string>
</resources>
Run Code Online (Sandbox Code Playgroud)
然后我的蚂蚁脚本这样做:
<copy file="config/config.xml" todir="res/values" overwrite="true" encoding="utf-8">
<filterset>
<filter token="CONFIG.SERVER_URL" value="${config.server_url}" />
</filterset>
</copy>
Run Code Online (Sandbox Code Playgroud)
其中config.server_url在prod.properties中定义.
我想知道如何用Maven完成类似的事情?有任何想法吗.我查找了如何使用maven读取属性文件,看起来结果是混合的,无论这是否有效.
我在android上遇到这个错误(AGAIN!).最近更新到最新版本的gradle 0.7.3以及最新版本的espresso框架(1.1),我又回到了臭名昭着的"重复文件"错误.
任务':mobile:packageTesttype'的执行失败.
在APK META-INF/LICENSE.txt中复制的重复文件文件1:/Users/mwolfe/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpmime/4.2.4/dba4d4d224e2ca872af5be8d2992777583145478/httpmime-4.2 .4.jar文件2:/Users/mwolfe/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpmime/4.2.4/dba4d4d224e2ca872af5be8d2992777583145478/httpmime-4.2.4.jar
我已经设置了build.gradle文件来排除这些文件.该应用程序组装好调试/发布并运行正常,但构建/运行测试失败.特别是当我尝试使用followng命令运行仪器测试时,我得到上面提到的错误.
gradle connectedCheck
Run Code Online (Sandbox Code Playgroud)
我也有一个库项目,并尝试了每种方法来为两个构建文件添加排除项.此特定依赖项来自库项目.它们都有以下排除
packagingOptions {
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/LICENSE.txt'
}
Run Code Online (Sandbox Code Playgroud)
我还尝试删除上面的META-INF部分,因为它在espresso文档中显示:https://code.google.com/p/android-test-kit/wiki/Espresso#Espresso_Setup_Instructions
我知道我可以从罐子里删除这些文件,但这很痛苦.
我有一个xml文件,如下所示:
<args>
<sometag value="abc" />
<anothertag value="def" />
<atag value="blah" />
</args>
Run Code Online (Sandbox Code Playgroud)
请记住args中的标记名称可以命名为任何东西(我不知道提前)现在我将这个xml文件存储在一个名为$ data的变量中,我使用xslt样式表中的document()调用加载它(不是xslt文件的后备数据)
我想获取该数据并产生以下输出: sometag = abc&anothertag = def&atag = blah
所以(一个非常简化的verison看起来像这样:
<xsl:template>
<xsl:variable name="data" select="document('/path/to/xml')" />
<xsl:call-template name='build_string'>
<xsl:with-param name='data' select='$data' />
</xsl:call-template>
</xsl:template>
<!-- here is where i need help -->
<xsl:template name="build_string">
<xsl:param name='data'>
<xsl:value-of select='name($data/.)' />=<xsl:value-of select='$data/@value' />
<xsl:if test='$data/following-sibling::node()'>
<xsl:text>&</xsl:text>
<xsl:call-template name="build_str">
<xsl:with-param name="data" select='$nodes/following-sibling::node()' />
</xsl:call-template>
</xsl:if>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
这几乎可以工作,但它也从输入文件打印文本节点,我不想匹配文本节点..
目前我正在使用异步http库来对我们的服务器执行http请求.然而,这会带来一个问题,即如果在屏幕旋转期间正在进行http调用,我们将在调用结束时引用旧的上下文.我通过保持对onCreate中捕获的最新实例的静态引用来解决这个问题,并使用该引用调用方法(并在onDestroy中将其置空).它运作正常但似乎是一个黑客.我见过有人推荐使用片段来解决这个问题,比如这里:
http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html
这似乎是好主意,但我想我可以通过简单地让我的Activity扩展FragmentActivity并使用AsyncTaskLoader子类来实现这一点,该子类专门用于我正在做的事情.
这是我的想法:使用ApiRequest实现AsyncTaskLoader并返回ApiResponse.但是,我希望能够继承HttpAsyncTask并覆盖一个解析响应的方法,这样我就可以解析响应并将其转换为另一种扩展ApiResponse的对象.我不知道如何指定类型参数来实现这一点.
这是我的代码:
public class HttpAsyncTaskLoader</*not sure what to put here*/> extends AsyncTaskLoader<? not sure ?> {
private ApiClient mClient ;
private ApiRequest mRequest;
private volatile boolean isExecuting = false;
public HttpAsyncTaskLoader(Context context, ApiClient client, ApiRequest request) {
super(context);
mClient = client;
mRequest = request;
}
/**
* Subclasses should override this method to do additional parsing
* @param response
* @return
*/
protected /*subclass of ApiResponse (or ApiResponse itself)*/ onResponse(ApiResponse response)
{
//base implementation just returns the …Run Code Online (Sandbox Code Playgroud) 我有以下课程,但我正在努力解决泛型问题
sealed class Result<T,E> {
data class Success<T>(val data: T): Result<T,Void>()
data class Failure<E>(val error: E): Result<Void,E>()
}
fun interface SeqListener<T,E> {
fun onComplete(result: Result<T,E>)
}
abstract class Seq<T,E> {
var started = false
private set
var complete = false
private set
private lateinit var seqListener: SeqListener<T,E>
fun start(listener: SeqListener<T,E>) {
if (!started) {
seqListener = listener
started = true
return doStart()
} else throw IllegalStateException("cannot call start on a sequence more than once")
}
fun success(result: Result.Success<T>) {
complete(result) …Run Code Online (Sandbox Code Playgroud) 我知道如何使用java的ANT构建工具获取文件的基本名称,但在这种情况下,我想更改文件名以包含构建版本号.不幸的是,文件的名称设置在我导入的另一个ant脚本(来自android系统)中,我无法为该文件设置属性,或者导入的脚本会抱怨该属性不应该已经设置.因此,如果我有一个属性持有MyApp-release.apk并且我想将值更改为MyApp-release-1.10.apk我该怎么做?我知道我可以将1.10放在带有basename的文件名的开头,这可能就是我要做的,但我宁愿那样做.