我对RxJava libraryReactive programmingRoom Database都很 fresh .所以,我最近才了解到,在使用数据层之前,您必须测试它.所以我用Java编写了所有这些代码.

My Database class

@Database(entities = {SimpleTask.class},version = 1,exportSchema = false)
@TypeConverters({CalendarConverter.class})
public abstract class TaskDatabase extends RoomDatabase {

    public abstract SimpleTaskDao simpleTaskDao();

}

My SimpleTaskDao

@Dao
public interface SimpleTaskDao {

    @Query("SELECT * FROM simpleTask")
    public Observable<List<SimpleTask>> observeAll();

    @Upsert
    public Completable upsert(SimpleTask task);

    @Upsert
    public Completable upsertAll(List<SimpleTask> taskList);

    @Query("UPDATE simpleTask SET `check`=:check WHERE `id`=:id")
    public Completable updateCompleted(int id, boolean check);

    @Query("DELETE FROM simpleTask")
    public Completable deleteAll();

}

My Database Module

@Module
@InstallIn(SingletonComponent.class)
public class DatabaseModule{
    final String DATABASE_NAME = "not_disclosing_this_here";

    @Singleton
    @Provides
    TaskDatabase provideDatabase(@ApplicationContext Context context){
        return Room.databaseBuilder(context.getApplicationContext(),TaskDatabase.class,DATABASE_NAME).build();
    }

    @Provides
    SimpleTaskDao provideSimpleTaskDao(TaskDatabase database) {
        return database.simpleTaskDao();
    }
}

My SimpleTask Model

@Entity(
        tableName = "simpleTask"
)
final public class SimpleTask {
    @PrimaryKey(autoGenerate = true)
    private int id;
    @ColumnInfo(name = "title")
    private String title;
    @ColumnInfo(name = "details")
    private String details;
    @ColumnInfo(name = "alarm")
    @TypeConverters(CalendarConverter.class)
    private Calendar alarm;
    @ColumnInfo(name = "repeat")
    private int repeat;
    @ColumnInfo(name = "check")
    private boolean check;

    @Ignore
    public SimpleTask(){}
    @Ignore
    public SimpleTask(String input){
        setTitle(input);
        setDetails("");
        setAlarm(null);
        setRepeat(0);
        setCheck(false);
    }
    @Ignore
    public SimpleTask(String title, String details, Calendar alarm, int repeat, boolean check){
        setTitle(title);
        setDetails(details);
        setAlarm(alarm);
        setRepeat(repeat);
        setCheck(check);
    }
    public SimpleTask(int id,String title, String details, Calendar alarm, int repeat, boolean check){
        setId(id);
        setTitle(title);
        setDetails(details);
        setAlarm(alarm);
        setRepeat(repeat);
        setCheck(check);
        Log.d("data creation","simple task created - "+id+title+alarm.toString()+repeat+check);
    }

    @Ignore
    public SimpleTask(String title, String desc) {
        setTitle(title);
        setDetails(desc);
    }

    @Ignore
    public SimpleTask(int id,String title, String desc) {
        setId(id);
        setTitle(title);
        setDetails(desc);
    }


    //    getter and setters

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public boolean isCheck() {
        return check;
    }

    public void setCheck(boolean check) {
        this.check = check;
    }

    public int getRepeat() {
        return repeat;
    }

    public void setRepeat(int repeat) {
        this.repeat = repeat;
    }

    public String getDetails() {
        return details;
    }

    public void setDetails(String details) {
        this.details = details;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public Calendar getAlarm() {
        return alarm;
    }

    public void setAlarm(Calendar alarm) {
        this.alarm = alarm;
    }

现在要进行测试了 My SimpleTaskDaoTest

public class SimpleTaskDaoTest {
    private TaskDatabase database;

    @Before
    public void initDb(){
        database = Room.inMemoryDatabaseBuilder(
                getApplicationContext(),
                TaskDatabase.class
        ).allowMainThreadQueries().build();
    }

    @Test
    public void insertTaskAndGetTask(){

        SimpleTask task = new SimpleTask(34,"title","description", Calendar.getInstance(),1,false);

        database.simpleTaskDao().upsert(task);

        TestObserver<List<SimpleTask>> testObserver = new TestObserver<>();
        database.simpleTaskDao().observeAll()
                .firstElement()
                .toObservable()
                .subscribe(testObserver);

        testObserver.awaitTerminalEvent();
        testObserver.assertNoErrors();
        testObserver.assertValue(taskList -> taskList.size()==1);

    }
}

所以在运行insertTaskAndGetTask()之后,我得到这个错误-java.lang.AssertionError: Value not present (latch = 0, values = 1, errors = 0, completions = 1)

当然,我理解观察者发出的SimpleTaskList是空的,100,我试着研究了一下,但我还是弄不明白!

推荐答案

您没有订阅此调用返回的Completable,这意味着不会发生upsert:

    database.simpleTaskDao().upsert(task);

您需要将此呼叫链接到后续的observeAll()呼叫,以确保它们都发生,并且它们以正确的顺序发生:

 public void insertTaskAndGetTask(){

        SimpleTask task = new SimpleTask(34,"title","description", Calendar.getInstance(),1,false);
        TestObserver<List<SimpleTask>> testObserver = new TestObserver<>();
        database.simpleTaskDao().upsert(task)
                .andThen(database.simpleTaskDao().observeAll())
                .firstElement()
                .toObservable()
                .subscribe(testObserver);

        testObserver.awaitTerminalEvent();
        testObserver.assertNoErrors();
        testObserver.assertValue(taskList -> taskList.size()==1);

    }

Java相关问答推荐

为什么我的画布没有显示在PFA应用程序中?

BiPredicate和如何使用它

如何转换Tue Feb 27 2024 16:35:30 GMT +0800 String至ZonedDateTime类型""

上下文初始化期间遇到异常-使用Java配置配置HibernateTemplate Bean时

我找不到&Quot;配置&的位置

对Java中的通配符参数的混淆

如何在ApachePOI中将图像添加到工作表的页眉?

使用Spring和ActiveMQ的侦听器方法引发属性名称不能重复为空警告

当Volatile关键字真的是必要的时候?

OpenGL ES 3.0-纹理黑色

为什么Spring Boot项目无法为基于MySQL的CRUD应用程序找到从JPARepository接口扩展的ProductRepository?

Spring Security不允许加载js

WebSockets和Spring Boot安全性出现错误401

Spring-Boot Kafka应用程序到GraalVM本机映像-找不到org.apache.kafka.streams.processor.internals.DefaultKafkaClientSupplier

如何使用路径过渡方法使 node 绕圆旋转?

STREAMS减少部分结果的问题

如何在不作为类出现的表上执行原生查询?

Oracle中从JSON中提取和插入数据

获取所有可以处理Invent.ACTION_MEDIA_BUTTON Android 13 API33的Android包

Vaadin Flow:设置密码显示按钮属性