Mockito-模拟生成器即使使用return_self也会返回一个空对象

时间:2019-01-21 03:00:43

标签: java android unit-testing mockito

我已经为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()的一部分进行进一步测试。

2 个答案:

答案 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);
    }