无法使用Realm+;在Android Studio中运行Robolectric测试;PowerMockito

无法使用Realm+;在Android Studio中运行Robolectric测试;PowerMockito,android,realm,robolectric,powermockito,Android,Realm,Robolectric,Powermockito,我使用Realm、PowerMockito和Robolectric为我的应用程序编写测试。如果我使用/gradlew test,但如果我在Android Studio中使用配置运行,测试运行正常。它将显示如下错误 com.thoughtworks.xstream.converters.ConversionException:无法构造org.powermock.modules.junit4.rule.PowerMockStatement$1,因为它没有无参数构造函数:无法构造org.powermo

我使用Realm、PowerMockito和Robolectric为我的应用程序编写测试。如果我使用
/gradlew test
,但如果我在Android Studio中使用配置运行,测试运行正常。它将显示如下错误

com.thoughtworks.xstream.converters.ConversionException:无法构造org.powermock.modules.junit4.rule.PowerMockStatement$1,因为它没有无参数构造函数:无法构造org.powermock.modules.junit4.rule.PowerMockStatement$1,因为它没有无参数构造函数

有人能解决这个问题吗?这是我在Kotlin写的测试

@RunWith(RobolectricGradleTestRunner::class)
@Config(application = TestApplication::class, constants = BuildConfig::class, sdk = intArrayOf(21))
@PowerMockIgnore("org.mockito.*", "org.robolectric.*", "android.*")
@SuppressStaticInitializationFor("io.realm.internal.Util")
@PrepareForTest(RealmCore::class, RealmLog::class, Realm::class, RealmResults::class, RealmQuery::class)
class RealmMiddlewareTest {

    data class TestState(var item: List<Item> = listOf())

    lateinit var realmMock: Realm

    lateinit var mockRealmResults: RealmResults<Item>

    val mockResults = arrayListOf(
            Item().apply {
                title = "item#1"
            },
            Item().apply {
                title = "item#2"
            },
            Item().apply {
                title = "item#3"
            }
    )

    @get:Rule
    val rule = PowerMockRule()

    @Before
    fun setUp() {
        PowerMockito.mockStatic(RealmCore::class.java)
        PowerMockito.mockStatic(RealmLog::class.java)
        PowerMockito.mockStatic(Realm::class.java)
        PowerMockito.mockStatic(RealmResults::class.java)
        Realm.init(RuntimeEnvironment.application)
        // Create the mock
        realmMock = PowerMockito.mock(Realm::class.java)

        // TODO: Better solution would be just mock the RealmConfiguration.Builder class. But it seems there is some
        // problems for powermock to mock it (static inner class). We just mock the RealmCore.loadLibrary(Context) which
        // will be called by RealmConfiguration.Builder's constructor.
        PowerMockito.doNothing().`when`(RealmCore::class.java)
        RealmCore.loadLibrary(Matchers.any(Context::class.java))
        `when`(Realm.getDefaultInstance()).thenReturn(realmMock)

        mockRealmResults = PowerMockito.mock(RealmResults::class.java) as RealmResults<Item>

        val mockQuery = PowerMockito.mock(RealmQuery::class.java)
        `when`(realmMock.where(Item::class.java)).thenReturn(mockQuery as RealmQuery<Item>)
        `when`(mockQuery.findFirst()).thenReturn(mockResults[0])
        `when`(mockQuery.findAll()).thenReturn(mockRealmResults)

        `when`(mockRealmResults.iterator()).thenReturn(mockResults.iterator())
        `when`(mockRealmResults.size).thenReturn(mockResults.size)


    }

    @Test
    fun realm_transaction_action_successfully_committed() {
        val testReducer = ReducerFn<TestState> { state, action ->
            if (action is RealmTransactionAction.Committed) {
                if (action.payloadType == Item::class.java.canonicalName) {
                    assertThat(action.payload as Item, sameInstance(mockResults[0]))
                }
            }
            state
        }
        val store = SimpleStore(TestState(), testReducer).applyMiddleware(RealmMiddleware())

        val transaction: (Realm) -> Item = {
            it.copyToRealm(mockRealmResults[0])
        }

        val action = RealmTransactionAction.create(transaction = transaction)
        store.dispatch(action)

        verify(realmMock, times(1)).executeTransaction(Mockito.any())
        verify(realmMock, times(1)).close()
    }

    @RealmClass
    open class Item() : RealmObject() {
        open var title: String = ""
    }
}
@RunWith(RobolectricGradleTestRunner::class)
@配置(application=TestApplication::class,constants=BuildConfig::class,sdk=intArrayOf(21))
@PowerMockIgnore(“org.mockito.*”、“org.roblectric.*”、“android.*”)
@SuppressStaticInitializationFor(“io.realm.internal.Util”)
@PrepareForTest(RealmCore::class、RealmLog::class、Realm::class、RealmResults::class、RealmQuery::class)
类重新测试{
数据类TestState(变量项:List=listOf())
lateinit var realmMock:Realm
lateinit var mockRealmResults:RealmResults
val mockResults=arrayListOf(
项()。应用{
title=“第1项”
},
项()。应用{
title=“第2项”
},
项()。应用{
title=“第3项”
}
)
@获取:规则
val rule=PowerMockRule()
@以前
趣味设置(){
mockStatic(RealmCore::class.java)
mockStatic(RealmLog::class.java)
mockStatic(Realm::class.java)
mockStatic(RealmResults::class.java)
Realm.init(RuntimeEnvironment.application)
//创建模拟
realmMock=PowerMockito.mock(Realm::class.java)
//TODO:更好的解决方案是模拟RealmConfiguration.Builder类。但似乎有一些
//powermock模拟它(静态内部类)的问题。我们只模拟RealmCore.loadLibrary(上下文),它
//将由RealmConfiguration.Builder的构造函数调用。
PowerMockito.doNothing().`when`(RealmCore::class.java)
loadLibrary(Matchers.any(Context::class.java))
`当`(Realm.getDefaultInstance())。然后返回(realmMock)
mockRealmResults=PowerMockito.mock(RealmResults::class.java)作为RealmResults
val mockQuery=PowerMockito.mock(RealmQuery::class.java)
`当`(realmMock.where(Item::class.java)).thenReturn(mockQuery作为RealmQuery)
`当`(mockQuery.findFirst())。然后返回(mockResults[0])
`当`(mockQuery.findAll())。然后返回(mockRealmResults)
`当`(mockRealmResults.iterator())。然后返回(mockResults.iterator())
`当`(mockRealmResults.size.),然后返回(mockResults.size)
}
@试验
乐趣领域\u事务\u操作\u成功\u提交(){
val testReducer=ReducerFn{状态,操作->
if(操作为RealmTransactionAction.Committed){
if(action.payloadType==Item::class.java.canonicalName){
断言(action.payload作为项,sameInstance(mockResults[0]))
}
}
状态
}
val store=SimpleStore(TestState(),testReducer).applyMiddleware(realmiddleware())
val事务:(领域)->项={
it.copyToRealm(mockRealmResults[0])
}
val action=RealmTransactionAction.create(事务=transaction)
仓库调度(行动)
验证(realmMock,times(1)).executeTransaction(Mockito.any())
验证(realmMock,次(1)).close()
}
@RealmClass
打开类项():RealmObject(){
打开变量标题:String=“”
}
}

刚刚检查过,似乎我使用的是v1.6.4。跳到1.6.5解决问题。谢谢小鸟,这并不能解决我的问题:/
testCompile 'org.powermock:powermock-module-junit4:1.6.5'
testCompile 'org.powermock:powermock-module-junit4-rule:1.6.5'
testCompile 'org.powermock:powermock-api-mockito:1.6.5'
testCompile 'org.powermock:powermock-classloading-xstream:1.6.5'