单元测试viewModel中的AssertionError

时间:2019-10-07 08:38:13

标签: android unit-testing

我在Bitbucket中有以下项目:https://bitbucket.org/ali-rezaei/storytel/src/master/

我有以下unitTest:

<div class="img-one">
    <img class="alignnone size-full wp-image-1303" src="image-source" alt="" width="850" height="1250" />
    <div class="adventure-link">
        <a href="page-link">Topic</a>
    </div>
</div>

这是结果:

@RunWith(MockitoJUnitRunner::class)
class MainViewModelTest {

    @get:Rule
    var rule: TestRule = InstantTaskExecutorRule()

    @Mock
    private lateinit var api: StorytelService

    private lateinit var viewModel: MainViewModel

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
    }

    @Test
    fun loadPosts() {
        val networkPhoto = NetworkPhoto(1, 1, "title", "url", "thumbnailUrl")
        `when`(api.getPhotos()).thenReturn(Observable.just(listOf(networkPhoto)))

        val networkPost = NetworkPost(1, 1, "title", "body")
        `when`(api.getPosts()).thenReturn(Observable.just(listOf(networkPost)))

        // Make the sure that all schedulers are immediate.
        val schedulerProvider = ImmediateSchedulerProvider()

        viewModel = MainViewModel(schedulerProvider, api)

        val observer = LoggingObserver<List<Post>>()
        viewModel.posts.observeForever(observer)

        with(observer) {
            assertThat(this, `is`(notNullValue()))
            assertThat(this.value?.size, `is`(1))
        }
    }

    /**
     * simple observer that logs the latest value it receives
     */
    private class LoggingObserver<T> : Observer<T> {
        var value: T? = null
        override fun onChanged(t: T?) {
            this.value = t
        }
    }
}

这是MainViewModel类:

java.lang.AssertionError: 
Expected: is <1>
     but: was null
Expected :is <1>
Actual   :null

如何解决?

1 个答案:

答案 0 :(得分:0)

问题是由以下原因引起的:

val networkPhoto = networkPhotos[Random().nextInt(networkPhotos.size - 1)]

由于networkPhotos列表中只有一张照片,因此代码称为Random().nextInt(0)

查看nextInt(int bound) documentation,您会发现零不是有效的参数,因此,抛出了IllegalArgumentException

在调用nextInt之前,应清除参数。