Java Mockito-即使使用了returns\u self,mock builder也会返回null对象

Java Mockito-即使使用了returns\u self,mock builder也会返回null对象,java,android,unit-testing,mockito,Java,Android,Unit Testing,Mockito,我已经在Android中创建了一个通知测试,并且正在努力创建模拟对象。当我试图模拟下面的notificationBuilder时,我得到一个空的notificationBuilder,这会破坏我的测试 我的最小代码显示了这一点: @Before public void setUp() { NotificationCompat.Builder notificationBuilder = Mockito.mock(NotificationCompat.Builder.class, Mocki

我已经在Android中创建了一个通知测试,并且正在努力创建模拟对象。当我试图模拟下面的
notificationBuilder
时,我得到一个空的
notificationBuilder
,这会破坏我的测试

我的最小代码显示了这一点:

@Before
public void setUp() {
    NotificationCompat.Builder notificationBuilder = Mockito.mock(NotificationCompat.Builder.class, Mockito.RETURNS_SELF);
}
其中notificationBuilder为空。如何获取模拟NotificationCompat.Builder作为返回值?我以为这就是
返回SELF
应该做的

对于空值,我无法将我的生成器用作when().then()的一部分进行进一步测试。

Mockito.mock(…)正在返回
null
,因为您没有模拟任何内容。您需要使用
@Mock
注释声明一个全局变量,并在
setUp()
方法中初始化您的Mock对象(只要它上面有
@之前的
注释,您就可以调用它)。请尝试下面的代码片段

    @Mock
    NotificationCompat.Builder notificationBuilder;

    @Before
    public void setUp(){
        notificationBuilder = Mockito.mock(NotificationCompat.Builder
                .class);

    }
   @Test
    public void testSharedPrefInjection(){

        assertNotNull(notificationBuilder);
    }

问题是您正在创建一个mock,它最终是
@Before
方法中的一个局部变量

当您以后运行测试时,这个变量不再可访问,也没有任何类的全局模拟的概念(至少在vanilla Mockito中)

因此,要么使用全局变量,然后在设置方法中手动初始化该变量:

private NotificationCompat.Builder notificationBuilder;

@Before
public void setUp() {
   notificationBuilder = Mockito.mock(NotificationCompat.Builder.class);
}
或者使用Mockito注释:

@Mock
private NotificationCompat.Builder notificationBuilder;

@Before
public void setUp() {
   MockitoAnnotations.initMocks(this);
}