0

I have PaymentPresenter with method payWorkOrder(). That method accepts some parameters and based on the logic created two new objects:

  1. WoPayment
  2. PaymentRequest

Here is the code for that:

@RunWith(PowerMockRunner.class) @PrepareForTest({TextUtils.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);
}
}
}

Here is my unit test:

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

But it fails with the following stacktrace:

java.lang.NullPointerException at com.test.presentation.agreements.payment.PaymentPresenter.payWorkOrderInvoice(PaymentPresenter.java:168) at com.test.presentation.agreements.PaymentPresenterTest.shouldPayWorkOrderInvoice(PaymentPresenterTest.java:175) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:310) at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89) at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$LastRuleTestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:148) at com.test.presentation.core.TrampolineSchedulerRule$1.evaluate(TrampolineSchedulerRule.java:21)

1 Answer 1

0

The stacktrace says that in the file PaymentPresenter.java in line 168, there is an access to an object that is 'null', i.e. not instantiated. So take a look at that line and try to find out why the object is not instantiated. It is hard to tell without having the line numbers of your files.

Sign up to request clarification or add additional context in comments.

6 Comments

Disposable disposable = workOrdersRepository.payWorkOrderInvoice(workOrderId, new PaymentRequest(woPayment))
That is this line. It seems that is related to new PaymenetRequest(woPayment)
It seems like the 'workOrdersRepository' variable has not been initialized. Can you show how you initialize it?
That is initialized for sure since I do not have issues with that on other unit tests in the same class. I have initialised it with @Mock annotation. I think that issues is with local scope of new objects created inside the method. I am talking about WoPayment and PaymentRequest. They are created locally inside that method, but I do not mock them. I am not sure how to mock them.
Ok, I do not think I can provide any further support because I lack information here. Can you provide a piece of code that is runnable and reproduces the problem? With the code seen so far I cannot reproduce the problem because I do not see how for example the 'workOrdersRepository' is initialized. That means I cannot run this code.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.