我有一个Android应用程序使用Dagger 2进行依赖注入.我还使用最新的gradle构建工具,它允许构建变体进行单元测试,一个用于仪器测试.我java.util.Random在我的应用程序中使用,我想模仿它进行测试.我正在测试的类不使用任何Android内容,所以它们只是常规的java类.
在我的主代码中,我Component在一个扩展Application类的类中定义了一个,但在单元测试中,我没有使用Application.我试着定义测试Module和Component,但匕首不会产生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) 我有一个带有SQLite数据库的应用程序,用于存储用户帐户的信息.我假设应用程序只有一个用户,我设计了数据库.因此,用户的ID不存储在数据库中(但它存储在服务器上的中央数据库中).但是,可以注销应用程序并让其他用户登录,但目前的问题是,他们的数据被下载然后附加到其他用户的数据.这不是我想要发生的事情,但我不确定如何最好地改变数据库设计来解决这个问题.我考虑过:
这些方法之一是好的吗?或者有更好的方法吗?
我有一个Android项目,使用Mockito,Hamcrest和Espresso来帮助测试.
不管我用摇篮尝试构建文件,我得到NoSuchMethodError的org.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) 我使用以下代码设置了进度条样式。
我已经声明了进度条小部件:
<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 时的显示方式)。任何输入都将不胜感激。
我的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 ×5
dagger-2 ×1
gradle ×1
java ×1
junit ×1
loader ×1
mockito ×1
progress-bar ×1
sqlite ×1
unit-testing ×1