【问题标题】:Mockito - mock builder returns a null object even when returns_self is usedMockito - 即使使用了returns_self,模拟构建器也会返回一个空对象
【发布时间】:2019-01-21 03:00:43
【问题描述】:

我已经为 Android 中的通知创建了一个测试,并且正在努力制作 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 为空。如何获得模拟 NotificationCompat.Builder 作为返回值?我认为这是RETURNS_SELF 应该做的。

对于 null 值,我不能将我的 Builder 用作 when().then() 的一部分进行进一步测试。

【问题讨论】:

    标签: java android unit-testing mockito


    【解决方案1】:

    问题是您正在创建一个模拟,它最终是@Before 方法内的一个局部变量。

    当您稍后运行测试时,该变量将无法再访问,也没有任何关于类的全局模拟的概念(至少在 vanilla Mockito 中)。

    所以要么使用全局变量,然后在 setUp 方法中手动初始化:

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

    【讨论】:

      【解决方案2】:

      Mockito.mock(...) 正在返回 null,因为您没有嘲笑任何东西。您需要使用@Mock 注释声明一个全局变量,并在setUp() 方法中初始化您的模拟对象(只要它有@Before 注释,您就可以调用它)。试试下面的代码 sn-p。

          @Mock
          NotificationCompat.Builder notificationBuilder;
      
          @Before
          public void setUp(){
              notificationBuilder = Mockito.mock(NotificationCompat.Builder
                      .class);
      
          }
         @Test
          public void testSharedPrefInjection(){
      
              assertNotNull(notificationBuilder);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-26
        • 1970-01-01
        • 2020-08-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多