Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Presenters方法中模拟新创建的对象?_Java_Android_Junit_Junit4_Android Testing - Fatal编程技术网

Java 如何在Presenters方法中模拟新创建的对象?

Java 如何在Presenters方法中模拟新创建的对象?,java,android,junit,junit4,android-testing,Java,Android,Junit,Junit4,Android Testing,我有PaymentPresenter方法payWorkOrder。该方法接受一些参数,并基于创建两个新对象的逻辑: WoPayment 付款请求 以下是代码: @RunWith(PowerMockRunner.class) @PrepareForTest({TextUtils.class, WoPayment.class, PaymentRequest.class}) public class PaymentPresenterTest extends BaseTest { @Rule Tram

我有PaymentPresenter方法payWorkOrder。该方法接受一些参数,并基于创建两个新对象的逻辑:

WoPayment 付款请求 以下是代码:

@RunWith(PowerMockRunner.class) @PrepareForTest({TextUtils.class, WoPayment.class, PaymentRequest.class})
public class PaymentPresenterTest extends BaseTest {

@Rule TrampolineSchedulerRule trampolineSchedulerRule = new  TrampolineSchedulerRule();

@Mock CustomersRepository customersRepository;
@Mock AgreementsRepository agreementsRepository;
@Mock WorkOrdersRepository workOrdersRepository;
@Mock PaymentPresenter.View view;
@Mock ResponseBody responseBody;

private PaymentPresenter presenter;

@Before public void setUp() {
mockTextUtils();
presenter = new PaymentPresenter(customersRepository,  agreementsRepository, workOrdersRepository);
presenter.setView(view);
}

public void payWorkOrderInvoice(int workOrderId, double amount, String paymentMethod, String checkNumber) {
disposables = RxUtil.initDisposables(disposables);

WoPayment woPayment = new WoPayment();

if(amount > 0) {
  woPayment.setAmount(amount);
} else {
  view.displayAmountShouldBeGreaterThanZero();
  return;
}

if(TextUtils.isEmpty(paymentMethod)) {
  view.displayPaymentMethodInvalid();
  return;
} else {
  woPayment.setPaymentMethod(paymentMethod);
}

if(paymentMethod.equalsIgnoreCase("Check") && TextUtils.isEmpty(checkNumber)) {
  view.displayReferenceNumberError();
  return;
} else {
  woPayment.setCheckNumber(checkNumber);
}

view.disablePayButton();

Disposable disposable = workOrdersRepository.payWorkOrderInvoice(workOrderId, new PaymentRequest(woPayment))
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(response -> {
      if(response.isSuccessful()) {
        view.displayWorkOrderInvoicePaid(response.body());
      } else {
        view.enablePayButton();
        view.displayWorkOrderInvoiceNotPaid();
      }
      }, throwable -> {
      view.enablePayButton();
      view.handleError(throwable);
    });

disposables.add(disposable);
}
}
}
下面是我的单元测试:

@Test public void shouldPayWorkOrderInvoice() {
// Given
int workOrderId = 1;
double amount = 1.0;
String paymentMethod = "cash";
String checkNumber = "1";
WorkOrderDetails workOrderDetails = Mockito.mock(WorkOrderDetails.class);
Response<WorkOrderDetails> response = Response.success(200, workOrderDetails);
WoPayment woPayment = new WoPayment();
woPayment.setAmount(amount);
woPayment.setCheckNumber(checkNumber);
woPayment.setPaymentMethod(paymentMethod);
PaymentRequest paymentRequest = new PaymentRequest(woPayment);

// When
Mockito.when(workOrdersRepository.payWorkOrderInvoice(workOrderId, paymentRequest)).thenReturn(Single.just(response));
presenter.payWorkOrderInvoice(workOrderId, amount, paymentMethod, checkNumber);

// Then
Mockito.verify(view).displayWorkOrderInvoicePaid(workOrderDetails);
}
但它会因以下stacktrace而失败:

位于的java.lang.NullPointerException com.test.presentation.agreements.payment.PaymentPresenter.payWorkOrderInvoicePaymentPresenter.java:168 在 com.test.presentation.agreements.PaymentPresenterTest.shouldPayWorkOrderInvoicePaymentPresenterTest.java:175 在sun.reflect.NativeMethodAccessorImpl.invoke0Native方法在 sun.reflect.NativeMethodAccessorImpl.invokeNativeMethodAccessorImpl.java:62 在 sun.reflect.DelegatingMethodAccessorImpl.invokeDelegatingMethodAccessorImpl.java:43 java:498 at org.junit.internal.runners.TestMethod.invokeTestMethod.java:68 at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethodPowerMockJUnit44RunnerDelegateImpl.java:310 在 org.junit.internal.runners.MethodRoadie$2.runMethodRoadie.java:89 在 org.junit.internal.runners.MethodRoadie.runbeforesthentestthenextermethodroadie.java:97 在 org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTestPowerMockJUnit44RunnerDelegateImpl.java:294 在 org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuperPowerMockJUnit47RunnerDelegateImpl.java:127 在 org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100PowerMockJUnit47RunnerDelegateImpl.java:59 在 org.powermock.modules.junit4.internal.impl.powermockjunit47 RunnerDelegateImpl$powermockJunit47 MethodRunner$LastRuleTestExecutorStatement.EvaluatePowerMockJunit47 RunnerDelegateImpl.java:148 在 com.test.presentation.core.trampolineScheduleRule$1.evaluateTrampolineScheduleRule.java:21


嘲弄地看待这个问题

您正在使用

Mockito.whenworkOrdersRepository.payWorkOrderInvoiceworkOrderId, paymentRequest.ThenReturnsSingle.justresponse

NPE的原因是paymentRequest,而Mock和下面代码中传递的不一样

Disposable disposable = workOrdersRepository.payWorkOrderInvoice(workOrderId, new PaymentRequest(woPayment))
.subscribeOn(Schedulers.io())
作为回报,当原始代码订阅它并引发空指针异常时,它不提供任何内容


请尝试anyPaymentRequest.class,而不是workOrderId anyInteger

请提供原始代码以及。。。或引发exception.Updated的行。原始代码就在那里,我已经注意到它在哪里引发了异常;在@beforetreated中,但仍然失败。你有其他想法吗?回答如下。这是我的荣幸@Zookey的额外一点
Disposable disposable = workOrdersRepository.payWorkOrderInvoice(workOrderId, new PaymentRequest(woPayment))
.subscribeOn(Schedulers.io())