android - 仅在 Android 本地单元测试中,ObjectBox ToOne 对象在实体内部为空

标签 android one-to-one objectbox

我正在尝试为我的一个存储库编写测试,但由于以下错误,我无法保存我的实体对象:

java.lang.IllegalStateException: ToOne object is null inside br.com.CalendarEvent

我的实体是这两个:
@Entity
data class CalendarEvent(
    @Id var boxId: Long = 0,

    @Index var id: String = UUID.randomUUID().toString(),

    var userId: String = "",

    var title: String = "",

    var discipline: String = "",

    var hour: Int = 1,

    var dateInEpochDay: Long = 0L,

    var isOnline: Boolean = false,

    var estimatedTime: Int = 1,

    var userAttended: Boolean? = null) {

    lateinit var nucleus: ToOne<SupportNucleus>

    lateinit var specialNeeds: ToMany<SpecialNeed>

}
@Entity
data class SupportNucleus(
@Id var boxId: Long = 0,

@Index var id: String = UUID.randomUUID().toString(),

var name: String = "",

var location: String = "",

var contact: String = "",

var phones: String = "",

var startWorkingHour: Int = 9,

var endWorkingHour: Int = 23,

@Transient var unavailableDays: List<Long> = listOf())

正如您所看到的,这两个实体都有它们的无参数构造函数,当我保存运行应用程序或运行检测测试的 CalendarEvent 时,我工作得很好。此错误仅发生在本地单元测试中

我的测试课:
class CalendarBoxRepositoryTest : BaseObjectBoxTest() {

    lateinit var subjectRepository: CalendarRepository

    var dataSourceMock: CalendarDataSource = mockk()
    var dataMapperMock: CalendarDataMapper = mockk()

    @Before
    fun setup() {
        subjectRepository = CalendarBox(dataSourceMock)
    }


    @Test
    fun save_calendar_event_correctly() {
        //Given no event was saved
        val calendarBoxBefore = store?.boxFor(CalendarEvent::class.java)
        assertEquals(0, calendarBoxBefore?.all?.size)

        val calendar = CalendarEvent(userId = "userId", title = "Title", discipline = "Discipline",
            dateInEpochDay = 123, isOnline = false, estimatedTime = 1, userAttended = null)

        val nucleus = SupportNucleus(name = "Support")


        calendar.nucleus = ToOne(calendar, CalendarEvent_.nucleus)
        calendar.nucleus.target = nucleus

        //When Saved
        runBlocking {
            subjectRepository.saveCalendarEvent(calendar)
        }

        //Verify saved correctly
        val calendarBoxAfter = store?.boxFor(CalendarEvent::class.java)
        assertEquals(1, calendarBoxAfter?.all?.size)
    }
}

当我在保存后尝试获取以断言它已正确保存时,实际上会发生错误。

最佳答案

尝试删除 lateinit来自 ToOne并立即初始化它:

@Entity
data class CalendarEvent(
...
    ) {

    var nucleus = ToOne<SupportNucleus>(this, CalendarEvent_.nucleus)

}

注意:在从 Android Studio 运行测试或直接运行 Gradle 任务时,Android 项目从 ObjectBox 1.5 或更高版本开始不再需要 ToOne/ToMany 初始化,例如testDebugUnitTest .

检查是否有像 objectboxTransformDebugUnitTest 这样的 Gradle 任务在测试任务之前运行(默认设置为)。

关于android - 仅在 Android 本地单元测试中,ObjectBox ToOne 对象在实体内部为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59361866/

相关文章:

c# - 一对一关系导致异常 : AssociationSet is in the 'Deleted' state. 给定多重约束

java - ObjectBox 是否有等效的 SQL Like 关键字

ObjectBox - 数据库备份/恢复

java - 在 Cordova/Android 项目中包含 javax 持久性

android - 无法访问 android/drawable 图标资源

android - libgdx 中的星空优化

typescript - TypeORM 延迟加载更新父级在子级保存时失败

java - Hibernate 与引用列的一对一映射(XML 映射)

android - 以编程方式添加的 Fragment 上的后退键会导致空容器

java - 如何在 Android 上以编程方式创建断点