代码之家  ›  专栏  ›  技术社区  ›  Vikalp Patel

如何检查mockito是否具有mock函数并返回,如中所述什么时候回来

  •  0
  • Vikalp Patel  · 技术社区  · 5 年前

    以下是我的测试方法

    @Test
    public void testAlerts_whenReturnsData() {
    //Assemble
    Product product = new Product(null, null, 0, "-1");
    
    when(api.alerts("-1", null, null))
        .thenReturn(Single.just(product));
    
    //Act
    viewModel.getAlertsData().observeForever(dataObserver);
    viewModel.getIsPhoneLoadingData().observeForever(loadingObserver);
    
    viewModel.getAlerts("1234567890");
    
    //Verify
    verify(loadingObserver).onChanged(true);
    verify(dataObserver).onChanged(product);
    verify(loadingObserver).onChanged(false);
    }
    

    void getAlerts(String phone) {
      isPhoneLoadingData.setValue(true);
    
      alertDisposable =
          api.alerts(id,
                  userManager.getNonNullUserId(), AlertsRequest.create(phone, true))
              .doOnEvent((product, throwable) -> isPhoneLoadingData.postValue(false))
              .compose(RxSingleSchedulers.DEFAULT.applySchedulers())
              .subscribe(alertsData::setValue, errorData::setValue);
    }
    

    例外:似乎不能嘲笑api.警报(字符串,字符串,警报请求)

    when(api.alerts(any(String.class), any(String.class), any(AlertsRequest.class)))
        .thenReturn(Single.just(product));
    

    public interface Api {
      Single<Product> alerts(
       String Id,
       String customerId,
       AlertsRequest request
      );
    }
    

    java.lang.NullPointerException在杜内文-api.警报()在getAlerts中

    如何检查mockito是否能够模拟函数并将按中的定义返回 when.thenReturn

    0 回复  |  直到 5 年前
        1
  •  1
  •   Jens Piegsa    5 年前

    我能想到这些可能的原因:

    1. 你有没有仔细检查过 NullPointerException ? (未初始化 api , userManager , isPhoneLoadingData
    2. A null any(String.class) .
    3. 如果有多个 alert 方法具有相同的参数计数,传递 会使它模棱两可。在这种情况下,您需要转换空参数,例如。 (String) null .

    1. 与模拟配置不匹配的方法调用,
    2. 未被任何调用命中的模拟配置。

    当你使用 org.mockito.junit.jupiter.MockitoExtension .

        2
  •  0
  •   Vikalp Patel    5 年前

    啊! AlertsRequest.create(phone, true) 是罪魁祸首。陷入了同样的情况;如果头脑清醒,或者改天,你可以用截然不同的角度看待你的问题。

    when(api.alerts("-1", null, null))
    .thenReturn(Single.just(product));
    

    哪里

    // here AlertsRequest.create(phone, true) mocking as null. 
    // But when actual call is made it creates a Object of AlertsRequest with phone as null & another parameter as true
    // that's the reason mocking was creating for api.alerts("-1", null, null)
    // here is it was api.alerts("-1", null, AlertsRequest(null, true))
    
    api.alerts(id, userManager.getNonNullUserId(), AlertsRequest.create(phone, true))
    

     void getAlerts(AlertsRequest request) {
      isPhoneLoadingData.setValue(true);
    
      alertDisposable =
            api.alerts(id,
              userManager.getNonNullUserId(), request)
              .doOnEvent((product, throwable) -> isPhoneLoadingData.postValue(false))
              .compose(RxSingleSchedulers.DEFAULT.applySchedulers())
              .subscribe(alertsData::setValue, errorData::setValue);
      }
    

    测试通过!