RecyclerView适配器在单元测试中

时间:2015-03-05 09:07:33

标签: android unit-testing

如何在Android Studio中运行单元测试时测试支持库类? 根据{{​​3}}的介绍,它适用于默认的Android类:

  

单元测试在开发计算机上的本地JVM上运行。我们的gradle插件将编译src / test / java中的源代码,并使用通常的Gradle测试机制执行它。在运行时,测试将针对android.jar的修改版本执行,其中所有最终修饰符都已被剥离。这使您可以使用流行的模拟库,如Mockito。

然而,当我尝试在如下所示的RecyclerView适配器上使用Mockito时:

@Before
public void setUp() throws Exception {
    adapter = mock(MyAdapterAdapter.class);
    when(adapter.hasStableIds()).thenReturn(true);
}

然后我会收到错误消息:

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'.
For example:
    when(mock.getArticles()).thenReturn(articles);

Also, this error might show up because:
1. you stub either of: final/private/equals()/hashCode() methods.
   Those methods *cannot* be stubbed/verified.
2. inside when() you don't call method on mock but on some other object.
3. the parent of the mocked class is not public.
   It is a limitation of the mock engine.

原因是支持库没有提供这样的jar文件“所有最终修饰符都已被剥离”。

那你怎么测试呢?通过继承&可能会覆盖最终方法(这不起作用,不)。也许是PowerMock?

2 个答案:

答案 0 :(得分:2)

PowerMockito解决方案

第1步: 找到合适的Mockito&来自https://code.google.com/p/powermock/wiki/MockitoUsage13的PowerMock版本,将其添加到build.gradle:

testCompile 'org.powermock:powermock-module-junit4:1.6.1'
testCompile 'org.powermock:powermock-api-mockito:1.6.1'
testCompile "org.mockito:mockito-core:1.10.8"

仅根据使用情况页面一起更新它们。

第2步: 设置单元测试类,准备目标类(包含最终方法):

@RunWith(PowerMockRunner.class)
@PrepareForTest( { MyAdapterAdapter.class })
public class AdapterTrackerTest {

第3步: 用PowerMockito替换Mockito ...方法:

adapter = PowerMockito.mock(PhotosHomeAlbumsAdapter.class);
PowerMockito.when(adapter.hasStableIds()).thenReturn(true);

答案 1 :(得分:0)

@Before
public void setUp() throws Exception {
    adapter = mock(MyAdapterAdapter.class);
    when(adapter.hasStableIds()).thenReturn(true);
}

编译器不解释“when”键。您可以使用“Mockito.when”(在 Java 中)或 Mockito.when(在 kotlin 中)。由于键“何时”已经存在于 Kotlin 语言中,因此需要这些撇号。您可以随时使用 Mockito。when 不过。