小编Pik*_*ing的帖子

Android单元使用Dagger 2进行测试

我有一个Android应用程序使用Dagger 2进行依赖注入.我还使用最新的gradle构建工具,它允许构建变体进行单元测试,一个用于仪器测试.我java.util.Random在我的应用程序中使用,我想模仿它进行测试.我正在测试的类不使用任何Android内容,所以它们只是常规的java类.

在我的主代码中,我Component在一个扩展Application类的类中定义了一个,但在单元测试中,我没有使用Application.我试着定义测试ModuleComponent,但匕首不会产生Component.我也尝试使用Component我在我的应用程序中定义的并交换Module构建它的时间,但应用程序Component没有inject我的测试类的方法.我如何提供Random用于测试的模拟实现?

这是一些示例代码:

应用:

public class PipeGameApplication extends Application {

    private PipeGame pipeGame;

    @Singleton
    @Component(modules = PipeGameModule.class)
    public interface PipeGame {
        void inject(BoardFragment boardFragment);
        void inject(ConveyorFragment conveyorFragment);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        pipeGame = DaggerPipeGameApplication_PipeGame.create();
    }

    public PipeGame component() {
        return pipeGame;
    }
}
Run Code Online (Sandbox Code Playgroud)

模块:

@Module
public class PipeGameModule {

    @Provides
    @Singleton
    Random …
Run Code Online (Sandbox Code Playgroud)

java android unit-testing dagger-2

50
推荐指数
2
解决办法
2万
查看次数

具有潜在多个用户的Android应用程序的SQLite数据库

我有一个带有SQLite数据库的应用程序,用于存储用户帐户的信息.我假设应用程序只有一个用户,我设计了数据库.因此,用户的ID不存储在数据库中(但它存储在服务器上的中央数据库中).但是,可以注销应用程序并让其他用户登录,但目前的问题是,他们的数据被下载然后附加到其他用户的数据.这不是我想要发生的事情,但我不确定如何最好地改变数据库设计来解决这个问题.我考虑过:

  1. 每个用户一个数据库.如果用户只是在他们朋友的电话上登录一次并且从不再登录,则可能导致不必要的数据存储.另外我猜这可能很难管理.
  2. 将用户ID列添加到所有表,因此追加不会导致问题.还有(1)具有的不必要的数据问题,并且失去了1的模块性.
  3. 用户注销时擦除数据库.如果用户在服务器上有大量数据,则在应用程序启动时同步数据需要很长时间(这将在另一个线程上完成,但仍然很麻烦).

这些方法之一是好的吗?或者有更好的方法吗?

sqlite android

13
推荐指数
1
解决办法
2638
查看次数

配置gradle以使用JUnit,Mockito,Hamcrest和Espresso

我有一个Android项目,使用Mockito,Hamcrest和Espresso来帮助测试.

不管我用摇篮尝试构建文件,我得到NoSuchMethodErrororg.hamcrest.Matcher.anyOf,当我尝试做后运行我的测试gradle androidTestCompile.

这是我目前的配置:

dependencies {
    compile project(':GameCore')
    androidTestCompile files(
            'libs/espresso-1.1.jar',
            'libs/testrunner-1.1.jar',
            'libs/testrunner-runtime-1.1.jar'
    )
    androidTestCompile(
            'junit:junit:4.11',
            'org.mockito:mockito-core:1.10.0',
            'com.google.guava:guava:14.0.1',
            'com.squareup.dagger:dagger:1.1.0',
            'com.google.dexmaker:dexmaker:1.0',
            'com.google.dexmaker:dexmaker-mockito:1.0',
            'org.hamcrest:hamcrest-core:1.3',
            'org.hamcrest:hamcrest-library:1.3'
            )
Run Code Online (Sandbox Code Playgroud)

我已经尝试重写Mockito和JUnit要求以排除Hamcrest,如下所示:

androidTestCompile('junit:junit:4.11') {
    exclude group: 'org.hamcrest'
}
Run Code Online (Sandbox Code Playgroud)

但这没有任何区别.

GameCore项目是一个纯Java项目.它也依赖于JUnit和Mockito,但正如它们被指定的那样testCompile,我认为它们不应该干扰它们.

gradle dependencies这个'androidTestCompile`模块的输出是:

+--- junit:junit:4.11                                                               
|    \--- org.hamcrest:hamcrest-core:1.3
+--- org.mockito:mockito-core:1.10.0
|    +--- org.hamcrest:hamcrest-core:1.1 -> 1.3
|    \--- org.objenesis:objenesis:2.1
+--- com.google.guava:guava:14.0.1
+--- com.squareup.dagger:dagger:1.1.0
|    \--- javax.inject:javax.inject:1
+--- com.google.dexmaker:dexmaker:1.0
+--- com.google.dexmaker:dexmaker-mockito:1.0
|    +--- com.google.dexmaker:dexmaker:1.0
|    \--- org.mockito:mockito-core:1.9.5 -> 1.10.0 …
Run Code Online (Sandbox Code Playgroud)

junit android mockito gradle android-espresso

8
推荐指数
1
解决办法
1万
查看次数

如何设置进度条背景

我使用以下代码设置了进度条样式。

我已经声明了进度条小部件:

 <ProgressBar
    android:id="@+id/loadProgress"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="20dip"
    android:max="100"
    android:progressDrawable="@drawable/load_progress"
    android:progress="0" />
Run Code Online (Sandbox Code Playgroud)

定义了“@drawable/load_progress”

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

<item
    android:id="@android:id/background"
    android:drawable="@drawable/background_bk">
</item>
<item
    android:id="@android:id/progress"
    android:drawable="@drawable/progress_bk">
</item>

</layer-list>
Run Code Online (Sandbox Code Playgroud)

定义了“@drawable/background_bk”(它是红色的)

<?xml version="1.0" encoding="utf-8"?>
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >

<gradient
    android:angle="0"
    android:endColor="#ff0000"
    android:startColor="#ff0990" />

<stroke
    android:width="1dp"
    android:color="#ff0000" />

 </shape>
Run Code Online (Sandbox Code Playgroud)

定义了@drawable/progress_bk(它是绿色的)

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >

<gradient
    android:angle="0"
    android:endColor="#00ff00"
    android:startColor="#00ff00" />

<stroke
    android:width="1dp"
    android:color="#00ff00" />

</shape>
Run Code Online (Sandbox Code Playgroud)

即使我将进度值设置为小于 100,进度条也始终显示为完全绿色(这是进度值为 100 时的显示方式)。任何输入都将不胜感激。

android progress-bar

7
推荐指数
2
解决办法
1万
查看次数

自定义AsyncTaskLoader回调问题

我的AsyncTaskLoader遇到了一些问题,不确定它们是否相关,因为它们在尝试重新启动Loader时都会发生.在我的应用程序中,我有3个自定义CursorAdapter实例,由3个由1个singleton LoaderManager管理的自定义AsyncTaskLoader实例支持.这些问题与两个不同的Adapter/Loader对有关,但在每种情况下使用的代码都是相同的:

getLoaderManager().restartLoader(loaderId, bundle, loaderManager);
Run Code Online (Sandbox Code Playgroud)

问题1:我调用restartLoader()并且LoaderManager注册了对onCreateLoader的调用,但没有注册到onLoaderReset().Loader获取deliverResult(),但永远不会调用onLoadFinished().Loader既没有设置'reset'或'started'标志(参见下面的代码).

问题2:我调用restartLoader()并且LoaderManager注册了对onLoaderReset()的调用.Loader获取onReset(),但没有进一步.Cursor设置为null,但没有加载新的Cursor.

任何想法可能是什么问题?以下是Loader和Loader Manager的一些代码:

CustomCursorLoader.java

@Override
protected void onStartLoading() {
    Log.v(TAG, "Starting Loader");
    if (lastCursor != null) {
        deliverResult(lastCursor);
    }
    if (takeContentChanged() || lastCursor == null) {
        forceLoad();
    }
}

@Override
public void deliverResult(Cursor cursor) {
    Log.v(TAG, "Delivering result");
    if (isReset()) {
        Log.v(TAG, "reset");
        if (cursor != null) {
            cursor.close();
        }
        return;
    }
    Cursor oldCursor = lastCursor;
    lastCursor = cursor;
    if (isStarted()) {
        Log.v(TAG, "started");
        super.deliverResult(cursor);
    }
    if (oldCursor != null && oldCursor != cursor …
Run Code Online (Sandbox Code Playgroud)

android loader android-asynctask android-loadermanager

6
推荐指数
1
解决办法
5279
查看次数