小编Hil*_*itz的帖子

如何在单元测试中处理模拟的RxJava2可观察抛出异常

过去几周我一直在使用MVP在Android中在Kotlin做TDD.事情进展顺利.

我使用Mockito来模拟类,但我似乎无法克服如何实现我想要运行的测试之一.

以下是我的测试:

  1. 调用api,接收数据列表,然后显示列表. loadAllPlacesTest()
  2. 调用api,接收空数据,然后显示列表. loadEmptyPlacesTest()
  3. 调用api,路上会发生一些异常,然后显示错误信息. loadExceptionPlacesTest()

我成功地测试了#1和#2.问题在于#3,我不确定如何在代码中进行测试.

RestApiInterface.kt

interface RestApiInterface {

@GET(RestApiManager.PLACES_URL)
fun getPlacesPagedObservable(
        @Header("header_access_token") accessToken: String?,
        @Query("page") page: Int?
): Observable<PlacesWrapper>
}
Run Code Online (Sandbox Code Playgroud)

RestApiManager.kt 实现接口的管理器类如下所示:

open class RestApiManager: RestApiInterface{
var api: RestApiInterface
    internal set
internal var retrofit: Retrofit
init {
    val logging = HttpLoggingInterceptor()
    // set your desired log level
    logging.setLevel(HttpLoggingInterceptor.Level.BODY)

    val client = okhttp3.OkHttpClient().newBuilder()
            .readTimeout(60, TimeUnit.SECONDS)
            .connectTimeout(60, TimeUnit.SECONDS)
            .addInterceptor(LoggingInterceptor())  
            .build()


    retrofit = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//very important for RXJAVA and retrofit
            .build()
    api …
Run Code Online (Sandbox Code Playgroud)

java android unit-testing retrofit2 rx-java2

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

使用robolectric进行单元测试会产生NoSuchMethodException错误

经过一段时间的研究后,我仍然没有发现为什么这个事情发生在我的Android代码中.这只是标准的简单单元测试代码,实际上还没有多少.我以前在我的工作机器上尝试过此代码并成功运行单元测试.我不知道为什么这会发生在我家里的其他电脑上.也许这可能是由一些不正确的robolectric 3设置造成的,我不太确定.我附上了完整的日志报告,也许你们能够更好地理解它.谢谢.

Gradle命令运行单元测试:

gradlew test
Run Code Online (Sandbox Code Playgroud)

错误:

com.sample.bigger.MainActivityTest > sampleTest FAILED
java.lang.RuntimeException                              
    Caused by: java.lang.RuntimeException               
        Caused by: java.lang.NoSuchMethodException      
Run Code Online (Sandbox Code Playgroud)

完整日志:

java.lang.RuntimeException: java.lang.NoSuchMethodException: android.os.Looper.<init>(boolean)
    at org.robolectric.util.ReflectionHelpers.callConstructor(ReflectionHelpers.java:297)
    at org.robolectric.shadows.ShadowLooper.createLooper(ShadowLooper.java:43)
    at org.robolectric.shadows.ShadowLooper.access$000(ShadowLooper.java:25)
    at org.robolectric.shadows.ShadowLooper$1.create(ShadowLooper.java:37)
    at org.robolectric.shadows.ShadowLooper$1.create(ShadowLooper.java:35)
    at org.robolectric.util.SoftThreadLocal$1.initialValue(SoftThreadLocal.java:13)
    at org.robolectric.util.SoftThreadLocal$1.initialValue(SoftThreadLocal.java:11)
    at java.lang.ThreadLocal.setInitialValue(ThreadLocal.java:160)
    at java.lang.ThreadLocal.get(ThreadLocal.java:150)
    at org.robolectric.util.SoftThreadLocal.get(SoftThreadLocal.java:18)
    at org.robolectric.shadows.ShadowLooper.resetThreadLoopers(ShadowLooper.java:55)
    at org.robolectric.Shadows.reset(Shadows.java:1612)
    at org.robolectric.Robolectric.reset(Robolectric.java:22)
    at org.robolectric.internal.ParallelUniverse.resetStaticState(ParallelUniverse.java:43)
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:233)
    at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:188)
    at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:54)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:152)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:86)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:49)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:69)
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:48)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) …
Run Code Online (Sandbox Code Playgroud)

android unit-testing nosuchmethoderror runtimeexception robolectric

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