我已经为Android中的Notifications创建了一个测试,并且正在努力制作Mock对象。当我尝试模拟this post(which suggests wrapping Android notifications in a custom class)之后的notificationBuilder
时,我得到一个空notificationBuilder
,这会破坏我的测试。
显示此代码的最小代码是:
@Before
public void setUp() {
NotificationCompat.Builder notificationBuilder = Mockito.mock(NotificationCompat.Builder.class, Mockito.RETURNS_SELF);
}
其中notificationBuilder为null。如何获得Mock NotificationCompat.Builder作为返回值?我以为这就是RETURNS_SELF
应该做的事。
使用空值时,我不能将Builder用作when()。then()的一部分进行进一步测试。
答案 0 :(得分:3)
问题在于您正在创建一个模拟,该模拟最终是LOG: process 3908 still waiting for ShareLock on transaction 1586 after 1001.058 ms
DETAIL: Process holding the lock: 3906. Wait queue: 3908.
CONTEXT: while inserting index tuple (0,7) in relation "n_id_idx"
STATEMENT: create (:n{id:1});
LOG: process 3908 acquired ShareLock on transaction 1586 after 4639.630 ms
CONTEXT: while inserting index tuple (0,7) in relation "n_id_idx"
STATEMENT: create (:n{id:1});
方法内部的局部变量。
稍后运行测试时,将不再可以访问此变量,也没有任何关于类的全局模拟的概念(至少在香草Mockito中如此)。
因此,请使用一个全局变量,然后使用setUp方法手动对其进行初始化:
@Before
或使用Mockito批注:
private NotificationCompat.Builder notificationBuilder;
@Before
public void setUp() {
notificationBuilder = Mockito.mock(NotificationCompat.Builder.class);
}
答案 1 :(得分:1)
Mockito.mock(...)
返回null
,因为您没有嘲笑任何东西。您需要使用@Mock
注释声明一个全局变量,并在setUp()
方法中初始化您的模拟对象(您可以调用此对象,只要它上面带有@Before
注释即可)。试试下面的代码片段。
@Mock
NotificationCompat.Builder notificationBuilder;
@Before
public void setUp(){
notificationBuilder = Mockito.mock(NotificationCompat.Builder
.class);
}
@Test
public void testSharedPrefInjection(){
assertNotNull(notificationBuilder);
}