killbill-memoizeit

invoice: fix InvoicePayment retrieval for CREDIT operation Signed-off-by:

6/17/2018 2:41:33 PM

Details

diff --git a/api/src/main/java/org/killbill/billing/invoice/api/InvoiceInternalApi.java b/api/src/main/java/org/killbill/billing/invoice/api/InvoiceInternalApi.java
index 69f6df1..20bf9b8 100644
--- a/api/src/main/java/org/killbill/billing/invoice/api/InvoiceInternalApi.java
+++ b/api/src/main/java/org/killbill/billing/invoice/api/InvoiceInternalApi.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2011 Ning, Inc.
- * Copyright 2014-2016 Groupon, Inc
- * Copyright 2014-2016 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -83,4 +83,6 @@ public interface InvoiceInternalApi {
     public List<InvoicePayment> getInvoicePayments(UUID paymentId, TenantContext context);
 
     public List<InvoicePayment> getInvoicePaymentsByAccount(UUID accountId, TenantContext context);
+
+    public List<InvoicePayment> getInvoicePaymentsByCookieId(String cookieId, TenantContext context);
 }
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java b/invoice/src/main/java/org/killbill/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java
index b648f1b..0a41e22 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java
@@ -216,4 +216,16 @@ public class DefaultInvoiceInternalApi implements InvoiceInternalApi {
                                                                            }
                                                                           ));
     }
+
+    @Override
+    public List<InvoicePayment> getInvoicePaymentsByCookieId(final String cookieId, final TenantContext context) {
+        return ImmutableList.<InvoicePayment>copyOf(Collections2.transform(dao.getInvoicePaymentsByCookieId(cookieId, internalCallContextFactory.createInternalTenantContext(context.getAccountId(), ObjectType.ACCOUNT, context)),
+                                                                           new Function<InvoicePaymentModelDao, InvoicePayment>() {
+                                                                               @Override
+                                                                               public InvoicePayment apply(final InvoicePaymentModelDao input) {
+                                                                                   return new DefaultInvoicePayment(input);
+                                                                               }
+                                                                           }
+                                                                          ));
+    }
 }
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
index fd7d11a..7a98a26 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
@@ -539,6 +539,16 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
     }
 
     @Override
+    public List<InvoicePaymentModelDao> getInvoicePaymentsByCookieId(final String cookieId, final InternalTenantContext context) {
+        return transactionalSqlDao.execute(true, new EntitySqlDaoTransactionWrapper<List<InvoicePaymentModelDao>>() {
+            @Override
+            public List<InvoicePaymentModelDao> inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception {
+                return entitySqlDaoWrapperFactory.become(InvoicePaymentSqlDao.class).getInvoicePaymentsByPaymentCookieId(cookieId, context);
+            }
+        });
+    }
+
+    @Override
     public InvoicePaymentModelDao createRefund(final UUID paymentId, final BigDecimal requestedRefundAmount, final boolean isInvoiceAdjusted,
                                                final Map<UUID, BigDecimal> invoiceItemIdsWithNullAmounts, final String transactionExternalKey,
                                                final InternalCallContext context) throws InvoiceApiException {
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceDao.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceDao.java
index 205c55f..ed85e64 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceDao.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceDao.java
@@ -64,6 +64,8 @@ public interface InvoiceDao extends EntityDao<InvoiceModelDao, Invoice, InvoiceA
 
     List<InvoicePaymentModelDao> getInvoicePaymentsByAccount(InternalTenantContext context);
 
+    List<InvoicePaymentModelDao> getInvoicePaymentsByCookieId(String cookieId, InternalTenantContext internalTenantContext);
+
     BigDecimal getAccountBalance(UUID accountId, InternalTenantContext context);
 
     BigDecimal getAccountCBA(UUID accountId, InternalTenantContext context);
@@ -174,7 +176,6 @@ public interface InvoiceDao extends EntityDao<InvoiceModelDao, Invoice, InvoiceA
      */
     List<InvoiceParentChildModelDao> getChildInvoicesByParentInvoiceId(UUID parentInvoiceId, final InternalCallContext context) throws InvoiceApiException;
 
-
     /**
      * Retrieve parent invoice by the parent account id
      *
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.java
index 994eb58..237d51a 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2016 Groupon, Inc
- * Copyright 2014-2016 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -27,9 +27,9 @@ import org.killbill.billing.callcontext.InternalTenantContext;
 import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.invoice.api.InvoicePayment;
 import org.killbill.billing.util.entity.dao.EntitySqlDao;
+import org.killbill.commons.jdbi.binder.SmartBindBean;
 import org.killbill.commons.jdbi.template.KillBillSqlDaoStringTemplate;
 import org.skife.jdbi.v2.sqlobject.Bind;
-import org.killbill.commons.jdbi.binder.SmartBindBean;
 import org.skife.jdbi.v2.sqlobject.SqlQuery;
 import org.skife.jdbi.v2.sqlobject.SqlUpdate;
 
@@ -50,6 +50,10 @@ public interface InvoicePaymentSqlDao extends EntitySqlDao<InvoicePaymentModelDa
                                                     @SmartBindBean final InternalTenantContext context);
 
     @SqlQuery
+    List<InvoicePaymentModelDao> getInvoicePaymentsByPaymentCookieId(@Bind("paymentCookieId") final String paymentId,
+                                                                     @SmartBindBean final InternalTenantContext context);
+
+    @SqlQuery
     InvoicePaymentModelDao getPaymentForCookieId(@Bind("paymentCookieId") final String paymentCookieId,
                                                  @SmartBindBean final InternalTenantContext context);
 
diff --git a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg
index 140ff05..e30386f 100644
--- a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg
+++ b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg
@@ -73,6 +73,14 @@ getAllPaymentsForInvoiceIncludedInit() ::= <<
 >>
 
 
+getInvoicePaymentsByPaymentCookieId() ::= <<
+  SELECT <allTableFields("")>
+  FROM <tableName()>
+  WHERE payment_cookie_id = :paymentCookieId
+  <AND_CHECK_TENANT("")>
+  <defaultOrderBy("")>
+  ;
+>>
 
 getInvoicePayments() ::= <<
     SELECT <allTableFields("")>
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/dao/MockInvoiceDao.java b/invoice/src/test/java/org/killbill/billing/invoice/dao/MockInvoiceDao.java
index 4ce8e42..20bf691 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/dao/MockInvoiceDao.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/dao/MockInvoiceDao.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2016 Groupon, Inc
- * Copyright 2014-2016 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -245,6 +245,11 @@ public class MockInvoiceDao extends MockEntityDaoBase<InvoiceModelDao, Invoice, 
     }
 
     @Override
+    public List<InvoicePaymentModelDao> getInvoicePaymentsByCookieId(final String cookieId, final InternalTenantContext internalTenantContext) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
     public void notifyOfPaymentCompletion(final InvoicePaymentModelDao invoicePayment, final InternalCallContext context) {
         synchronized (monitor) {
             payments.put(invoicePayment.getId(), invoicePayment);
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceHelper.java b/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceHelper.java
index 30d07e7..431f709 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceHelper.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceHelper.java
@@ -38,6 +38,7 @@ import org.killbill.billing.account.api.AccountUserApi;
 import org.killbill.billing.account.api.ImmutableAccountInternalApi;
 import org.killbill.billing.callcontext.InternalCallContext;
 import org.killbill.billing.callcontext.InternalTenantContext;
+import org.killbill.billing.callcontext.MutableCallContext;
 import org.killbill.billing.callcontext.MutableInternalCallContext;
 import org.killbill.billing.catalog.MockPlan;
 import org.killbill.billing.catalog.MockPlanPhase;
@@ -264,16 +265,18 @@ public class TestInvoiceHelper {
                                                             .paymentMethodId(UUID.randomUUID())
                                                             .timeZone(DateTimeZone.UTC)
                                                             .createdDate(clock.getUTCNow())
+
                                                             .build();
+        final MutableCallContext mutableCallContext = new MutableCallContext(internalCallContext);
 
         final Account account;
         if (isFastTest()) {
-            account = GuicyKillbillTestSuiteNoDB.createMockAccount(accountData, accountUserApi, accountApi, immutableAccountApi, nonEntityDao, clock, internalCallContextFactory, callContext, internalCallContext);
+            account = GuicyKillbillTestSuiteNoDB.createMockAccount(accountData, accountUserApi, accountApi, immutableAccountApi, nonEntityDao, clock, internalCallContextFactory, mutableCallContext, internalCallContext);
         } else {
             account = accountUserApi.createAccount(accountData, callContext);
         }
 
-        GuicyKillbillTestSuite.refreshCallContext(account.getId(), clock, internalCallContextFactory, callContext, internalCallContext);
+        GuicyKillbillTestSuite.refreshCallContext(account.getId(), clock, internalCallContextFactory, mutableCallContext, internalCallContext);
 
         return account;
     }
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java
index 30b16f9..19b7656 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java
@@ -701,7 +701,7 @@ public class InvoiceResource extends JaxRsResourceBase {
         final InvoicePayment result = createPurchaseForInvoice(account, invoiceId, payment.getPurchasedAmount(), paymentMethodId, externalPayment,
                                                                payment.getPaymentExternalKey(), null, pluginProperties, callContext);
         return result != null ?
-               uriBuilder.buildResponse(uriInfo, InvoicePaymentResource.class, "getInvoicePayment", result.getId(), request) :
+               uriBuilder.buildResponse(uriInfo, InvoicePaymentResource.class, "getInvoicePayment", result.getPaymentId(), request) :
                Response.status(Status.NO_CONTENT).build();
     }
 
diff --git a/payment/src/main/java/org/killbill/billing/payment/api/DefaultInvoicePaymentApi.java b/payment/src/main/java/org/killbill/billing/payment/api/DefaultInvoicePaymentApi.java
index 0194518..5a9d924 100644
--- a/payment/src/main/java/org/killbill/billing/payment/api/DefaultInvoicePaymentApi.java
+++ b/payment/src/main/java/org/killbill/billing/payment/api/DefaultInvoicePaymentApi.java
@@ -101,17 +101,17 @@ public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
         final Collection<PluginProperty> pluginProperties = preparePluginPropertiesForRefundOrCredit(isAdjusted, adjustments, originalProperties);
         final String paymentTransactionExternalKey = MoreObjects.firstNonNull(originalPaymentTransactionExternalKey, UUIDs.randomUUID().toString());
 
-        final Payment payment = paymentApi.createRefundWithPaymentControl(account,
-                                                                          paymentId,
-                                                                          amount,
-                                                                          currency,
-                                                                          effectiveDate,
-                                                                          paymentTransactionExternalKey,
-                                                                          pluginProperties,
-                                                                          InvoicePaymentPaymentOptions.create(paymentOptions),
-                                                                          context);
-
-        return getInvoicePayment(payment.getId(), paymentTransactionExternalKey, context);
+        paymentApi.createRefundWithPaymentControl(account,
+                                                  paymentId,
+                                                  amount,
+                                                  currency,
+                                                  effectiveDate,
+                                                  paymentTransactionExternalKey,
+                                                  pluginProperties,
+                                                  InvoicePaymentPaymentOptions.create(paymentOptions),
+                                                  context);
+
+        return getInvoicePayment(paymentTransactionExternalKey, context);
     }
 
     @Override
@@ -134,19 +134,19 @@ public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
 
         final String paymentTransactionExternalKey = MoreObjects.firstNonNull(originalPaymentTransactionExternalKey, UUIDs.randomUUID().toString());
 
-        final Payment payment = paymentApi.createCreditWithPaymentControl(account,
-                                                                          paymentMethodId,
-                                                                          paymentId,
-                                                                          amount,
-                                                                          currency,
-                                                                          effectiveDate,
-                                                                          paymentExternalKey,
-                                                                          paymentTransactionExternalKey,
-                                                                          pluginProperties,
-                                                                          InvoicePaymentPaymentOptions.create(paymentOptions),
-                                                                          context);
-
-        return getInvoicePayment(payment.getId(), paymentTransactionExternalKey, context);
+        paymentApi.createCreditWithPaymentControl(account,
+                                                  paymentMethodId,
+                                                  paymentId,
+                                                  amount,
+                                                  currency,
+                                                  effectiveDate,
+                                                  paymentExternalKey,
+                                                  paymentTransactionExternalKey,
+                                                  pluginProperties,
+                                                  InvoicePaymentPaymentOptions.create(paymentOptions),
+                                                  context);
+
+        return getInvoicePayment(paymentTransactionExternalKey, context);
     }
 
     @Override
@@ -175,12 +175,8 @@ public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
         return pluginProperties;
     }
 
-    private InvoicePayment getInvoicePayment(final UUID paymentId, final String paymentTransactionExternalKey, final TenantContext context) {
-        for (final InvoicePayment invoicePayment : getInvoicePayments(paymentId, context)) {
-            if (invoicePayment.getPaymentCookieId().compareTo(paymentTransactionExternalKey) == 0) {
-                return invoicePayment;
-            }
-        }
-        return null;
+    private InvoicePayment getInvoicePayment(final String paymentTransactionExternalKey, final TenantContext context) {
+        final List<InvoicePayment> invoicePayments = invoiceInternalApi.getInvoicePaymentsByCookieId(paymentTransactionExternalKey, context);
+        return invoicePayments.isEmpty() ? null : invoicePayments.get(invoicePayments.size() - 1);
     }
 }
diff --git a/payment/src/main/java/org/killbill/billing/payment/api/svcs/DefaultInvoicePaymentInternalApi.java b/payment/src/main/java/org/killbill/billing/payment/api/svcs/DefaultInvoicePaymentInternalApi.java
index 22930b0..38710ca 100644
--- a/payment/src/main/java/org/killbill/billing/payment/api/svcs/DefaultInvoicePaymentInternalApi.java
+++ b/payment/src/main/java/org/killbill/billing/payment/api/svcs/DefaultInvoicePaymentInternalApi.java
@@ -47,7 +47,6 @@ import org.killbill.billing.util.config.definition.PaymentConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.MoreObjects;
 import com.google.inject.Inject;
 
 import static org.killbill.billing.payment.logging.PaymentLoggingHelper.logEnterAPICall;
@@ -147,15 +146,11 @@ public class DefaultInvoicePaymentInternalApi extends DefaultApiBase implements 
                            exception);
         }
 
-        return paymentTransaction != null ? getInvoicePayment(payment.getId(), paymentTransaction.getExternalKey(), callContext) : null;
+        return paymentTransaction != null ? getInvoicePayment(paymentTransaction.getExternalKey(), callContext) : null;
     }
 
-    private InvoicePayment getInvoicePayment(final UUID paymentId, final String paymentTransactionExternalKey, final TenantContext context) {
-        for (final InvoicePayment invoicePayment : invoiceInternalApi.getInvoicePayments(paymentId, context)) {
-            if (invoicePayment.getPaymentCookieId().compareTo(paymentTransactionExternalKey) == 0) {
-                return invoicePayment;
-            }
-        }
-        return null;
+    private InvoicePayment getInvoicePayment(final String paymentTransactionExternalKey, final TenantContext context) {
+        final List<InvoicePayment> invoicePayments = invoiceInternalApi.getInvoicePaymentsByCookieId(paymentTransactionExternalKey, context);
+        return invoicePayments.isEmpty() ? null : invoicePayments.get(invoicePayments.size() - 1);
     }
 }
diff --git a/payment/src/test/java/org/killbill/billing/payment/TestPaymentHelper.java b/payment/src/test/java/org/killbill/billing/payment/TestPaymentHelper.java
index 5114550..0ecd4e3 100644
--- a/payment/src/test/java/org/killbill/billing/payment/TestPaymentHelper.java
+++ b/payment/src/test/java/org/killbill/billing/payment/TestPaymentHelper.java
@@ -30,6 +30,7 @@ import org.killbill.billing.account.api.AccountUserApi;
 import org.killbill.billing.account.api.ImmutableAccountInternalApi;
 import org.killbill.billing.callcontext.InternalCallContext;
 import org.killbill.billing.callcontext.InternalTenantContext;
+import org.killbill.billing.callcontext.MutableCallContext;
 import org.killbill.billing.callcontext.MutableInternalCallContext;
 import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.events.InvoiceCreationInternalEvent;
@@ -148,14 +149,16 @@ public class TestPaymentHelper {
         Mockito.when(accountData.getCreatedDate()).thenReturn(clock.getUTCNow());
         Mockito.when(accountData.getReferenceTime()).thenReturn(clock.getUTCNow());
 
+        final MutableCallContext mutableCallContext = new MutableCallContext(internalCallContext);
+
         Account account;
         if (isFastTest()) {
-            account = GuicyKillbillTestSuiteNoDB.createMockAccount(accountData, accountApi, accountInternalApi, immutableAccountInternalApi, nonEntityDao, clock, internalCallContextFactory, context, internalCallContext);
+            account = GuicyKillbillTestSuiteNoDB.createMockAccount(accountData, accountApi, accountInternalApi, immutableAccountInternalApi, nonEntityDao, clock, internalCallContextFactory, mutableCallContext, internalCallContext);
         } else {
             account = accountApi.createAccount(accountData, context);
         }
 
-        GuicyKillbillTestSuite.refreshCallContext(account.getId(), clock, internalCallContextFactory, context, internalCallContext);
+        GuicyKillbillTestSuite.refreshCallContext(account.getId(), clock, internalCallContextFactory, mutableCallContext, internalCallContext);
 
         if (addPaymentMethod) {
             final PaymentMethodPlugin pm = new DefaultNoOpPaymentMethodPlugin(UUID.randomUUID().toString(), true, null);
diff --git a/util/src/test/java/org/killbill/billing/callcontext/MutableCallContext.java b/util/src/test/java/org/killbill/billing/callcontext/MutableCallContext.java
index 725df20..b79ffba 100644
--- a/util/src/test/java/org/killbill/billing/callcontext/MutableCallContext.java
+++ b/util/src/test/java/org/killbill/billing/callcontext/MutableCallContext.java
@@ -26,7 +26,7 @@ import org.killbill.billing.util.callcontext.UserType;
 
 public class MutableCallContext implements CallContext {
 
-    private final CallContext delegate;
+    private CallContext delegate;
     private DateTime createdDate;
 
     public MutableCallContext(final MutableInternalCallContext internalCallContext) {
@@ -34,6 +34,10 @@ public class MutableCallContext implements CallContext {
         this.createdDate = delegate.getCreatedDate();
     }
 
+    public void setDelegate(final UUID accountId, final MutableInternalCallContext internalCallContext) {
+        this.delegate = internalCallContext.toCallContext(accountId, null);
+    }
+
     @Override
     public UUID getUserToken() {
         return delegate.getUserToken();
diff --git a/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java b/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java
index a8f886a..f2b2a72 100644
--- a/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java
+++ b/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java
@@ -105,7 +105,7 @@ public class GuicyKillbillTestSuite implements IHookable {
     public static void refreshCallContext(final UUID accountId,
                                           final Clock clock,
                                           final InternalCallContextFactory internalCallContextFactory,
-                                          final TenantContext callContext,
+                                          final MutableCallContext callContext,
                                           final MutableInternalCallContext internalCallContext) {
         final InternalTenantContext tmp = internalCallContextFactory.createInternalTenantContext(accountId, callContext);
         internalCallContext.setAccountRecordId(tmp.getAccountRecordId());
@@ -113,6 +113,8 @@ public class GuicyKillbillTestSuite implements IHookable {
         internalCallContext.setReferenceTime(tmp.getReferenceLocalTime());
         internalCallContext.setCreatedDate(clock.getUTCNow());
         internalCallContext.setUpdatedDate(clock.getUTCNow());
+
+        callContext.setDelegate(accountId, internalCallContext);
     }
 
     protected KillbillConfigSource getConfigSource() {
diff --git a/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuiteNoDB.java b/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuiteNoDB.java
index a337c8f..06c00ad 100644
--- a/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuiteNoDB.java
+++ b/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuiteNoDB.java
@@ -27,6 +27,7 @@ import org.killbill.billing.account.api.AccountInternalApi;
 import org.killbill.billing.account.api.AccountUserApi;
 import org.killbill.billing.account.api.ImmutableAccountInternalApi;
 import org.killbill.billing.callcontext.InternalTenantContext;
+import org.killbill.billing.callcontext.MutableCallContext;
 import org.killbill.billing.callcontext.MutableInternalCallContext;
 import org.killbill.billing.dao.MockNonEntityDao;
 import org.killbill.billing.util.callcontext.CallContext;
@@ -44,7 +45,7 @@ public class GuicyKillbillTestSuiteNoDB extends GuicyKillbillTestSuite {
                                             final NonEntityDao nonEntityDao,
                                             final Clock clock,
                                             final InternalCallContextFactory internalCallContextFactory,
-                                            final CallContext callContext,
+                                            final MutableCallContext callContext,
                                             final MutableInternalCallContext internalCallContext) throws AccountApiException {
         final Account account = accountUserApi.createAccount(accountData, callContext);