killbill-memoizeit

Details

diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/glue/MockEngineModuleMemory.java b/entitlement/src/test/java/com/ning/billing/entitlement/glue/MockEngineModuleMemory.java
index 7836eca..aa0d174 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/glue/MockEngineModuleMemory.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/glue/MockEngineModuleMemory.java
@@ -25,6 +25,7 @@ import org.skife.config.ConfigurationObjectFactory;
 import org.skife.jdbi.v2.IDBI;
 
 import com.ning.billing.GuicyKillbillTestModule;
+import com.ning.billing.GuicyKillbillTestNoDBModule;
 import com.ning.billing.ObjectType;
 import com.ning.billing.api.TestListenerStatus;
 import com.ning.billing.entitlement.api.timeline.RepairEntitlementLifecycleDao;
@@ -62,16 +63,10 @@ public class MockEngineModuleMemory extends MockEngineModule {
         bind(NotificationQueueConfig.class).toInstance(config);
     }
 
-    protected void installDBI() {
-        final IDBI idbi = Mockito.mock(IDBI.class);
-        bind(IDBI.class).toInstance(idbi);
-    }
-
     @Override
     protected void configure() {
-        installDBI();
 
-        install(new GuicyKillbillTestModule());
+        install(new GuicyKillbillTestNoDBModule());
 
         super.configure();
 
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
index 30512d3..c104f04 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
@@ -460,7 +460,7 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
     }
 
     @VisibleForTesting
-    BigDecimal computePositiveRefundAmount(final InvoicePaymentModelDao payment, final BigDecimal requestedAmount, final Map<UUID, BigDecimal> invoiceItemIdsWithAmounts) throws InvoiceApiException {
+    static BigDecimal computePositiveRefundAmount(final InvoicePaymentModelDao payment, final BigDecimal requestedAmount, final Map<UUID, BigDecimal> invoiceItemIdsWithAmounts) throws InvoiceApiException {
         final BigDecimal maxRefundAmount = payment.getAmount() == null ? BigDecimal.ZERO : payment.getAmount();
         final BigDecimal requestedPositiveAmount = requestedAmount == null ? maxRefundAmount : requestedAmount;
         // This check is good but not enough, we need to also take into account previous refunds
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/invoice/TestDefaultInvoicePaymentApi.java b/invoice/src/test/java/com/ning/billing/invoice/api/invoice/TestDefaultInvoicePaymentApi.java
index 6cfe4cb..7d9c2f9 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/invoice/TestDefaultInvoicePaymentApi.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/invoice/TestDefaultInvoicePaymentApi.java
@@ -63,33 +63,6 @@ public class TestDefaultInvoicePaymentApi extends InvoiceTestSuiteWithEmbeddedDB
     private static final BigDecimal THIRTY = new BigDecimal("30.00");
     private static final Currency CURRENCY = Currency.EUR;
 
-    private final Clock clock = new ClockMock();
-    private final CacheControllerDispatcher controllerDispatcher = new CacheControllerDispatcher();
-
-    private InvoiceSqlDao invoiceSqlDao;
-    private InvoiceItemSqlDao invoiceItemSqlDao;
-    private InvoicePaymentApi invoicePaymentApi;
-    private InvoiceInternalApi invoiceInternalApi;
-    private InternalCallContextFactory internalCallContextFactory;
-
-    @BeforeSuite(groups = "slow")
-    public void setup() throws IOException {
-        final IDBI dbi = getDBI();
-
-        invoiceSqlDao = dbi.onDemand(InvoiceSqlDao.class);
-        invoiceSqlDao.test(internalCallContext);
-
-        invoiceItemSqlDao = dbi.onDemand(InvoiceItemSqlDao.class);
-        invoiceItemSqlDao.test(internalCallContext);
-
-        final NonEntityDao nonEntityDao = new DefaultNonEntityDao(dbi);
-        final NextBillingDatePoster nextBillingDatePoster = new MockNextBillingDatePoster();
-        internalCallContextFactory = new InternalCallContextFactory(clock, nonEntityDao, controllerDispatcher);
-        final InvoiceDao invoiceDao = new DefaultInvoiceDao(dbi, nextBillingDatePoster, Mockito.mock(InternalBus.class), clock, controllerDispatcher, nonEntityDao);
-        invoicePaymentApi = new DefaultInvoicePaymentApi(invoiceDao, internalCallContextFactory);
-        invoiceInternalApi = new DefaultInvoiceInternalApi(invoiceDao);
-    }
-
     @Test(groups = "slow")
     public void testFullRefundWithNoAdjustment() throws Exception {
         verifyRefund(THIRTY, THIRTY, THIRTY, false, ImmutableMap.<UUID, BigDecimal>of());
@@ -113,8 +86,8 @@ public class TestDefaultInvoicePaymentApi extends InvoiceTestSuiteWithEmbeddedDB
     @Test(groups = "slow")
     public void testFullRefundWithBothInvoiceItemAdjustments() throws Exception {
         // Create an invoice with two items (30 \u20ac and 10 \u20ac)
-        final Invoice invoice = createAndPersistInvoice(invoiceSqlDao, invoiceItemSqlDao, clock,
-                                                        ImmutableList.<BigDecimal>of(THIRTY, BigDecimal.TEN), CURRENCY, callContext, internalCallContextFactory);
+        final Invoice invoice = createAndPersistInvoice(invoiceDao,  clock,
+                                                        ImmutableList.<BigDecimal>of(THIRTY, BigDecimal.TEN), CURRENCY, internalCallContext);
 
         // Fully adjust both items
         final Map<UUID, BigDecimal> adjustments = new HashMap<UUID, BigDecimal>();
@@ -127,8 +100,8 @@ public class TestDefaultInvoicePaymentApi extends InvoiceTestSuiteWithEmbeddedDB
     @Test(groups = "slow")
     public void testPartialRefundWithSingleInvoiceItemAdjustment() throws Exception {
         // Create an invoice with two items (30 \u20ac and 10 \u20ac)
-        final Invoice invoice = createAndPersistInvoice(invoiceSqlDao, invoiceItemSqlDao, clock,
-                                                        ImmutableList.<BigDecimal>of(THIRTY, BigDecimal.TEN), CURRENCY, callContext, internalCallContextFactory);
+        final Invoice invoice = createAndPersistInvoice(invoiceDao,  clock,
+                                                        ImmutableList.<BigDecimal>of(THIRTY, BigDecimal.TEN), CURRENCY, internalCallContext);
 
         // Fully adjust both items
         final Map<UUID, BigDecimal> adjustments = new HashMap<UUID, BigDecimal>();
@@ -140,8 +113,8 @@ public class TestDefaultInvoicePaymentApi extends InvoiceTestSuiteWithEmbeddedDB
     @Test(groups = "slow")
     public void testPartialRefundWithTwoInvoiceItemAdjustment() throws Exception {
         // Create an invoice with two items (30 \u20ac and 10 \u20ac)
-        final Invoice invoice = createAndPersistInvoice(invoiceSqlDao, invoiceItemSqlDao, clock,
-                                                        ImmutableList.<BigDecimal>of(THIRTY, BigDecimal.TEN), CURRENCY, callContext, internalCallContextFactory);
+        final Invoice invoice = createAndPersistInvoice(invoiceDao,  clock,
+                                                        ImmutableList.<BigDecimal>of(THIRTY, BigDecimal.TEN), CURRENCY, internalCallContext);
         // Adjust partially both items: the invoice posted was 40 \u20ac, but we should really just have charged you 2 \u20ac
         final ImmutableMap<UUID, BigDecimal> adjustments = ImmutableMap.<UUID, BigDecimal>of(invoice.getInvoiceItems().get(0).getId(), new BigDecimal("29"),
                                                                                              invoice.getInvoiceItems().get(1).getId(), new BigDecimal("9"));
@@ -150,7 +123,7 @@ public class TestDefaultInvoicePaymentApi extends InvoiceTestSuiteWithEmbeddedDB
 
     private void verifyRefund(final BigDecimal invoiceAmount, final BigDecimal refundAmount, final BigDecimal finalInvoiceAmount,
                               final boolean adjusted, final Map<UUID, BigDecimal> invoiceItemIdsWithAmounts) throws InvoiceApiException {
-        final Invoice invoice = createAndPersistInvoice(invoiceSqlDao, invoiceItemSqlDao, clock, invoiceAmount, CURRENCY, callContext, internalCallContextFactory);
+        final Invoice invoice = createAndPersistInvoice(invoiceDao,  clock, invoiceAmount, CURRENCY, internalCallContext);
         verifyRefund(invoice, invoiceAmount, refundAmount, finalInvoiceAmount, adjusted, invoiceItemIdsWithAmounts);
     }
 
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/user/TestEventJson.java b/invoice/src/test/java/com/ning/billing/invoice/api/user/TestEventJson.java
index 240fb0a..5be52fc 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/user/TestEventJson.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/user/TestEventJson.java
@@ -24,12 +24,12 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.invoice.InvoiceTestSuite;
+import com.ning.billing.invoice.InvoiceTestSuiteNoDB;
 import com.ning.billing.util.events.InvoiceCreationInternalEvent;
 import com.ning.billing.util.events.NullInvoiceInternalEvent;
 import com.ning.billing.util.jackson.ObjectMapper;
 
-public class TestEventJson extends InvoiceTestSuite {
+public class TestEventJson extends InvoiceTestSuiteNoDB {
 
     private static final ObjectMapper mapper = new ObjectMapper();
 
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/TestDefaultInvoiceDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/TestDefaultInvoiceDao.java
index 16b0c48..e6ad194 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/TestDefaultInvoiceDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/TestDefaultInvoiceDao.java
@@ -31,7 +31,7 @@ import org.testng.annotations.Test;
 
 import com.ning.billing.ErrorCode;
 import com.ning.billing.dao.MockNonEntityDao;
-import com.ning.billing.invoice.InvoiceTestSuite;
+import com.ning.billing.invoice.InvoiceTestSuiteNoDB;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.notification.NextBillingDatePoster;
@@ -42,35 +42,7 @@ import com.ning.billing.util.svcsapi.bus.InternalBus;
 
 import com.google.common.collect.ImmutableMap;
 
-public class TestDefaultInvoiceDao extends InvoiceTestSuite {
-
-    private InvoiceSqlDao invoiceSqlDao;
-    private DefaultInvoiceDao dao;
-    private final CacheControllerDispatcher controllerDispatcher = new CacheControllerDispatcher();
-
-
-    @BeforeMethod(groups = "fast")
-    public void setUp() throws Exception {
-        final IDBI idbi = Mockito.mock(IDBI.class);
-        invoiceSqlDao = Mockito.mock(InvoiceSqlDao.class);
-        Mockito.when(idbi.onDemand(InvoiceSqlDao.class)).thenReturn(invoiceSqlDao);
-        Mockito.when(invoiceSqlDao.getById(Mockito.anyString(), Mockito.<InternalTenantContext>any())).thenReturn(Mockito.mock(InvoiceModelDao.class));
-        Mockito.when(invoiceSqlDao.inTransaction(Mockito.<Transaction<Void, EntitySqlDao<InvoiceModelDao, Invoice>>>any())).thenAnswer(new Answer() {
-            @Override
-            public Object answer(final InvocationOnMock invocation) {
-                final Object[] args = invocation.getArguments();
-                try {
-                    ((Transaction<Void, InvoiceSqlDao>) args[0]).inTransaction(invoiceSqlDao, null);
-                } catch (Exception e) {
-                    Assert.fail(e.toString());
-                }
-                return null;
-            }
-        });
-
-        final NextBillingDatePoster poster = Mockito.mock(NextBillingDatePoster.class);
-        dao = new DefaultInvoiceDao(idbi, poster, Mockito.mock(InternalBus.class), clock, controllerDispatcher, new MockNonEntityDao());
-    }
+public class TestDefaultInvoiceDao extends InvoiceTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testComputePositiveRefundAmount() throws Exception {
@@ -105,7 +77,7 @@ public class TestDefaultInvoiceDao extends InvoiceTestSuite {
         final InvoicePaymentModelDao invoicePayment = Mockito.mock(InvoicePaymentModelDao.class);
         Mockito.when(invoicePayment.getAmount()).thenReturn(paymentAmount);
 
-        final BigDecimal actualRefundAmount = dao.computePositiveRefundAmount(invoicePayment, requestedAmount, invoiceItemIdsWithAmounts);
+        final BigDecimal actualRefundAmount = DefaultInvoiceDao.computePositiveRefundAmount(invoicePayment, requestedAmount, invoiceItemIdsWithAmounts);
         Assert.assertEquals(actualRefundAmount, expectedRefundAmount);
     }
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModule.java b/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModule.java
new file mode 100644
index 0000000..dc73fed
--- /dev/null
+++ b/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModule.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2010-2013 Ning, Inc.
+ *
+ * Ning 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
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.invoice.glue;
+
+import org.mockito.Mockito;
+
+import com.ning.billing.GuicyKillbillTestWithEmbeddedDBModule;
+import com.ning.billing.catalog.glue.CatalogModule;
+import com.ning.billing.mock.glue.MockGlobalLockerModule;
+import com.ning.billing.util.email.EmailModule;
+import com.ning.billing.util.email.templates.TemplateModule;
+import com.ning.billing.util.glue.CacheModule;
+import com.ning.billing.util.glue.CallContextModule;
+import com.ning.billing.util.glue.CustomFieldModule;
+import com.ning.billing.util.glue.NonEntityDaoModule;
+import com.ning.billing.util.glue.NotificationQueueModule;
+import com.ning.billing.util.glue.TagStoreModule;
+import com.ning.billing.util.svcapi.account.AccountInternalApi;
+import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
+import com.ning.billing.util.svcapi.junction.BillingInternalApi;
+
+public class TestInvoiceModule extends DefaultInvoiceModule {
+
+
+
+    private void installExternalApis() {
+        bind(EntitlementInternalApi.class).toInstance(Mockito.mock(EntitlementInternalApi.class));
+        bind(AccountInternalApi.class).toInstance(Mockito.mock(AccountInternalApi.class));
+        bind(BillingInternalApi.class).toInstance(Mockito.mock(BillingInternalApi.class));
+    }
+
+    @Override
+    protected void configure() {
+        super.configure();
+
+        install(new MockGlobalLockerModule());
+
+        install(new CatalogModule());
+        install(new CacheModule());
+        install(new TemplateModule());
+        install(new EmailModule());
+
+        install(new NotificationQueueModule());
+        install(new TagStoreModule());
+        install(new CustomFieldModule());
+
+        installExternalApis();
+
+    }
+}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleNoDB.java b/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleNoDB.java
new file mode 100644
index 0000000..14d2139
--- /dev/null
+++ b/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleNoDB.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2010-2013 Ning, Inc.
+ *
+ * Ning 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
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.invoice.glue;
+
+import com.ning.billing.GuicyKillbillTestNoDBModule;
+import com.ning.billing.invoice.dao.InvoiceDao;
+import com.ning.billing.invoice.dao.MockInvoiceDao;
+import com.ning.billing.mock.glue.MockNonEntityDaoModule;
+import com.ning.billing.util.bus.InMemoryBusModule;
+
+public class TestInvoiceModuleNoDB extends TestInvoiceModule {
+
+    protected void installInvoiceDao() {
+        bind(InvoiceDao.class).to(MockInvoiceDao.class);
+    }
+
+    @Override
+    public void configure() {
+        super.configure();
+        install(new GuicyKillbillTestNoDBModule());
+        install(new MockNonEntityDaoModule());
+        install(new InMemoryBusModule());
+    }
+}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteNoDB.java b/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteNoDB.java
new file mode 100644
index 0000000..8c7dd0a
--- /dev/null
+++ b/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteNoDB.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning 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
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.invoice;
+
+import java.io.IOException;
+import java.net.URL;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+
+import com.ning.billing.KillbillTestSuite;
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.invoice.api.InvoiceMigrationApi;
+import com.ning.billing.invoice.api.InvoicePaymentApi;
+import com.ning.billing.invoice.api.InvoiceUserApi;
+import com.ning.billing.invoice.dao.InvoiceDao;
+import com.ning.billing.invoice.generator.InvoiceGenerator;
+import com.ning.billing.invoice.glue.InvoiceModuleWithEmbeddedDb;
+import com.ning.billing.invoice.glue.TestInvoiceModuleNoDB;
+import com.ning.billing.util.api.TagUserApi;
+import com.ning.billing.util.cache.CacheControllerDispatcher;
+import com.ning.billing.util.callcontext.InternalCallContextFactory;
+import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.globallocker.GlobalLocker;
+import com.ning.billing.util.svcapi.account.AccountInternalApi;
+import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
+import com.ning.billing.util.svcapi.invoice.InvoiceInternalApi;
+import com.ning.billing.util.svcapi.junction.BillingInternalApi;
+import com.ning.billing.util.svcsapi.bus.BusService;
+import com.ning.billing.util.svcsapi.bus.InternalBus;
+
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+
+import static org.testng.Assert.assertNotNull;
+
+public abstract class InvoiceTestSuiteNoDB extends KillbillTestSuite {
+
+    private static final Logger log = LoggerFactory.getLogger(InvoiceTestSuiteNoDB.class);
+
+
+    protected static final Currency accountCurrency = Currency.USD;
+
+    @Inject
+    protected InternalBus bus;
+    @Inject
+    protected CacheControllerDispatcher controllerDispatcher;
+    @Inject
+    protected InvoiceUserApi invoiceUserApi;
+    @Inject
+    protected InvoicePaymentApi invoicePaymentApi;
+    @Inject
+    protected InvoiceMigrationApi migrationApi;
+    @Inject
+    protected InvoiceGenerator generator;
+    @Inject
+    protected BillingInternalApi billingApi;
+    @Inject
+    protected AccountInternalApi accountApi;
+    @Inject
+    protected EntitlementInternalApi entitlementApi;
+    @Inject
+    protected BusService busService;
+    @Inject
+    protected TagUserApi tagUserApi;
+    @Inject
+    protected GlobalLocker locker;
+    @Inject
+    protected Clock clock;
+    @Inject
+    protected InternalCallContextFactory internalCallContextFactory;
+    @Inject
+    protected InvoiceInternalApi invoiceInternalApi;
+    @Inject
+    protected InvoiceDao invoiceDao;
+
+
+    @BeforeClass(groups = "fast")
+    protected void setup() throws Exception {
+
+        loadSystemPropertiesFromClasspath("/resource.properties");
+
+        final Injector injector = Guice.createInjector(new TestInvoiceModuleNoDB());
+        injector.injectMembers(this);
+    }
+
+    @BeforeMethod(groups = "fast")
+    public void setupTest() {
+        bus.start();
+    }
+
+    @AfterMethod(groups = "fast")
+    public void cleanupTest() {
+        bus.stop();
+    }
+
+    private static void loadSystemPropertiesFromClasspath(final String resource) {
+        final URL url = InvoiceModuleWithEmbeddedDb.class.getResource(resource);
+        assertNotNull(url);
+        try {
+            System.getProperties().load(url.openStream());
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java b/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java
index de4234f..683267b 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java
@@ -16,7 +16,114 @@
 
 package com.ning.billing.invoice;
 
-import com.ning.billing.KillbillTestSuiteWithEmbeddedDB;
+import java.io.IOException;
+import java.net.URL;
+
+import org.skife.jdbi.v2.IDBI;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+
+import com.ning.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.invoice.api.InvoiceMigrationApi;
+import com.ning.billing.invoice.api.InvoicePaymentApi;
+import com.ning.billing.invoice.api.InvoiceUserApi;
+import com.ning.billing.invoice.dao.InvoiceDao;
+import com.ning.billing.invoice.dao.InvoiceItemSqlDao;
+import com.ning.billing.invoice.dao.InvoicePaymentSqlDao;
+import com.ning.billing.invoice.dao.InvoiceSqlDao;
+import com.ning.billing.invoice.generator.InvoiceGenerator;
+import com.ning.billing.invoice.glue.InvoiceModuleWithEmbeddedDb;
+import com.ning.billing.invoice.glue.TestInvoiceModuleWithEmbeddedDb;
+import com.ning.billing.util.api.TagUserApi;
+import com.ning.billing.util.cache.CacheControllerDispatcher;
+import com.ning.billing.util.callcontext.InternalCallContextFactory;
+import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.globallocker.GlobalLocker;
+import com.ning.billing.util.svcapi.account.AccountInternalApi;
+import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
+import com.ning.billing.util.svcapi.invoice.InvoiceInternalApi;
+import com.ning.billing.util.svcapi.junction.BillingInternalApi;
+import com.ning.billing.util.svcsapi.bus.BusService;
+import com.ning.billing.util.svcsapi.bus.InternalBus;
+
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+
+import static org.testng.Assert.assertNotNull;
+
+public abstract class InvoiceTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteWithEmbeddedDB {
+
+    private static final Logger log = LoggerFactory.getLogger(InvoiceTestSuiteWithEmbeddedDB.class);
+
+
+    protected static final Currency accountCurrency = Currency.USD;
+
+    @Inject
+    protected InternalBus bus;
+    @Inject
+    protected CacheControllerDispatcher controllerDispatcher;
+    @Inject
+    protected InvoiceUserApi invoiceUserApi;
+    @Inject
+    protected InvoicePaymentApi invoicePaymentApi;
+    @Inject
+    protected InvoiceMigrationApi migrationApi;
+    @Inject
+    protected InvoiceGenerator generator;
+    @Inject
+    protected BillingInternalApi billingApi;
+    @Inject
+    protected AccountInternalApi accountApi;
+    @Inject
+    protected EntitlementInternalApi entitlementApi;
+    @Inject
+    protected BusService busService;
+    @Inject
+    protected InvoiceDao invoiceDao;
+    @Inject
+    protected TagUserApi tagUserApi;
+    @Inject
+    protected GlobalLocker locker;
+    @Inject
+    protected Clock clock;
+    @Inject
+    protected InternalCallContextFactory internalCallContextFactory;
+    @Inject
+    protected InvoiceInternalApi invoiceInternalApi;
+
+
+    @BeforeClass(groups = "slow")
+    protected void setup() throws Exception {
+
+        loadSystemPropertiesFromClasspath("/resource.properties");
+
+        final Injector injector = Guice.createInjector(new TestInvoiceModuleWithEmbeddedDb());
+        injector.injectMembers(this);
+    }
+
+    @BeforeMethod(groups = "slow")
+    public void setupTest() {
+        bus.start();
+    }
+
+    @AfterMethod(groups = "slow")
+    public void cleanupTest() {
+        bus.stop();
+    }
+
+    private static void loadSystemPropertiesFromClasspath(final String resource) {
+        final URL url = InvoiceModuleWithEmbeddedDb.class.getResource(resource);
+        assertNotNull(url);
+        try {
+            System.getProperties().load(url.openStream());
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
 
-public abstract class InvoiceTestSuiteWithEmbeddedDB extends KillbillTestSuiteWithEmbeddedDB {
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java b/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java
index b1a6db5..1c6726c 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java
@@ -30,7 +30,7 @@ import org.testng.annotations.BeforeSuite;
 import org.testng.annotations.Test;
 
 import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.invoice.InvoiceTestSuite;
+import com.ning.billing.invoice.InvoiceTestSuiteNoDB;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoiceItemType;
@@ -44,7 +44,7 @@ import com.ning.billing.invoice.model.RepairAdjInvoiceItem;
 import com.ning.billing.util.email.templates.MustacheTemplateEngine;
 import com.ning.billing.util.template.translation.TranslatorConfig;
 
-public class TestDefaultInvoiceFormatter extends InvoiceTestSuite {
+public class TestDefaultInvoiceFormatter extends InvoiceTestSuiteNoDB {
 
     private TranslatorConfig config;
     private MustacheTemplateEngine templateEngine;
diff --git a/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceItemFormatter.java b/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceItemFormatter.java
index e91f9be..9c14d71 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceItemFormatter.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceItemFormatter.java
@@ -30,7 +30,7 @@ import org.testng.annotations.BeforeSuite;
 import org.testng.annotations.Test;
 
 import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.invoice.InvoiceTestSuite;
+import com.ning.billing.invoice.InvoiceTestSuiteNoDB;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
 import com.ning.billing.invoice.model.RecurringInvoiceItem;
@@ -38,7 +38,7 @@ import com.ning.billing.util.LocaleUtils;
 import com.ning.billing.util.email.templates.MustacheTemplateEngine;
 import com.ning.billing.util.template.translation.TranslatorConfig;
 
-public class TestDefaultInvoiceItemFormatter extends InvoiceTestSuite {
+public class TestDefaultInvoiceItemFormatter extends InvoiceTestSuiteNoDB {
 
     private TranslatorConfig config;
     private MustacheTemplateEngine templateEngine;
diff --git a/invoice/src/test/java/com/ning/billing/invoice/TestHtmlInvoiceGenerator.java b/invoice/src/test/java/com/ning/billing/invoice/TestHtmlInvoiceGenerator.java
index bcd4ea7..ce08611 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/TestHtmlInvoiceGenerator.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/TestHtmlInvoiceGenerator.java
@@ -41,7 +41,7 @@ import com.ning.billing.util.email.templates.MustacheTemplateEngine;
 import com.ning.billing.util.email.templates.TemplateEngine;
 import com.ning.billing.util.template.translation.TranslatorConfig;
 
-public class TestHtmlInvoiceGenerator extends InvoiceTestSuite {
+public class TestHtmlInvoiceGenerator extends InvoiceTestSuiteNoDB {
 
     private HtmlInvoiceGenerator g;
 
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/InvoiceTestUtils.java b/invoice/src/test/java/com/ning/billing/invoice/tests/InvoiceTestUtils.java
index b7bc6cb..8d7cdaf 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/InvoiceTestUtils.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/InvoiceTestUtils.java
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
 
+import org.joda.time.DateTime;
 import org.mockito.Mockito;
 import org.testng.Assert;
 
@@ -30,9 +31,11 @@ import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoicePayment;
 import com.ning.billing.invoice.api.InvoicePayment.InvoicePaymentType;
+import com.ning.billing.invoice.dao.InvoiceDao;
 import com.ning.billing.invoice.dao.InvoiceItemModelDao;
 import com.ning.billing.invoice.dao.InvoiceItemSqlDao;
 import com.ning.billing.invoice.dao.InvoiceModelDao;
+import com.ning.billing.invoice.dao.InvoicePaymentModelDao;
 import com.ning.billing.invoice.dao.InvoiceSqlDao;
 import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
 import com.ning.billing.util.callcontext.CallContext;
@@ -43,34 +46,31 @@ import com.ning.billing.util.entity.EntityPersistenceException;
 import com.ning.billing.util.svcapi.invoice.InvoiceInternalApi;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 
 public class InvoiceTestUtils {
 
     private InvoiceTestUtils() {}
 
-    public static Invoice createAndPersistInvoice(final InvoiceSqlDao invoiceSqlDao,
-                                                  final InvoiceItemSqlDao invoiceItemSqlDao,
+    public static Invoice createAndPersistInvoice(final InvoiceDao invoiceDao,
                                                   final Clock clock,
                                                   final BigDecimal amount,
                                                   final Currency currency,
-                                                  final CallContext callContext,
-                                                  final InternalCallContextFactory internalCallContextFactory) {
+                                                  final InternalCallContext internalCallContext) {
         try {
-            return createAndPersistInvoice(invoiceSqlDao, invoiceItemSqlDao, clock, ImmutableList.<BigDecimal>of(amount),
-                                           currency, callContext, internalCallContextFactory);
+            return createAndPersistInvoice(invoiceDao, clock, ImmutableList.<BigDecimal>of(amount),
+                                           currency, internalCallContext);
         } catch (EntityPersistenceException e) {
             Assert.fail(e.getMessage());
             return null;
         }
     }
 
-    public static Invoice createAndPersistInvoice(final InvoiceSqlDao invoiceSqlDao,
-                                                  final InvoiceItemSqlDao invoiceItemSqlDao,
+    public static Invoice createAndPersistInvoice(final InvoiceDao invoiceDao,
                                                   final Clock clock,
                                                   final List<BigDecimal> amounts,
                                                   final Currency currency,
-                                                  final CallContext callContext,
-                                                  final InternalCallContextFactory internalCallContextFactory) throws EntityPersistenceException {
+                                                  final InternalCallContext internalCallContext) throws EntityPersistenceException {
         final Invoice invoice = Mockito.mock(Invoice.class);
         final UUID invoiceId = UUID.randomUUID();
         final UUID accountId = UUID.randomUUID();
@@ -83,18 +83,15 @@ public class InvoiceTestUtils {
         Mockito.when(invoice.isMigrationInvoice()).thenReturn(false);
 
         final List<InvoiceItem> invoiceItems = new ArrayList<InvoiceItem>();
+        final List<InvoiceItemModelDao> invoiceModelItems = new ArrayList<InvoiceItemModelDao>();
         for (final BigDecimal amount : amounts) {
             final InvoiceItem invoiceItem = createInvoiceItem(clock, invoiceId, accountId, amount, currency);
-            invoiceItemSqlDao.create(new InvoiceItemModelDao(invoiceItem), internalCallContextFactory.createInternalCallContext(accountId, callContext));
+            invoiceModelItems.add(new InvoiceItemModelDao(invoiceItem));
             invoiceItems.add(invoiceItem);
         }
         Mockito.when(invoice.getInvoiceItems()).thenReturn(invoiceItems);
 
-        try {
-            invoiceSqlDao.create(new InvoiceModelDao(invoice), internalCallContextFactory.createInternalCallContext(accountId, callContext));
-        } catch (EntityPersistenceException e) {
-            Assert.fail(e.getMessage());
-        }
+        invoiceDao.createInvoice(new InvoiceModelDao(invoice), invoiceModelItems, ImmutableList.<InvoicePaymentModelDao>of(), true, ImmutableMap.<UUID, DateTime>of(), internalCallContext);
 
         return invoice;
     }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/TestChargeBacks.java b/invoice/src/test/java/com/ning/billing/invoice/tests/TestChargeBacks.java
index bd980a0..461a8d8 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/TestChargeBacks.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/TestChargeBacks.java
@@ -40,7 +40,6 @@ import com.ning.billing.invoice.api.svcs.DefaultInvoiceInternalApi;
 import com.ning.billing.invoice.dao.DefaultInvoiceDao;
 import com.ning.billing.invoice.dao.InvoiceDao;
 import com.ning.billing.invoice.dao.InvoiceItemSqlDao;
-import com.ning.billing.invoice.dao.InvoiceSqlDao;
 import com.ning.billing.invoice.glue.InvoiceModuleWithEmbeddedDb;
 import com.ning.billing.invoice.notification.MockNextBillingDatePoster;
 import com.ning.billing.invoice.notification.NextBillingDatePoster;
@@ -65,7 +64,6 @@ public class TestChargeBacks extends InvoiceTestSuiteWithEmbeddedDB {
     private static final BigDecimal FIFTEEN = new BigDecimal("15.00");
     private static final BigDecimal THIRTY = new BigDecimal("30.00");
     private static final BigDecimal ONE_MILLION = new BigDecimal("1000000.00");
-    private InvoiceSqlDao invoiceSqlDao;
     private InvoiceItemSqlDao invoiceItemSqlDao;
     private InvoicePaymentApi invoicePaymentApi;
     private InvoiceInternalApi invoiceApi;
@@ -82,8 +80,7 @@ public class TestChargeBacks extends InvoiceTestSuiteWithEmbeddedDB {
 
         final IDBI dbi = getDBI();
 
-        invoiceSqlDao = dbi.onDemand(InvoiceSqlDao.class);
-        invoiceSqlDao.test(internalCallContext);
+        invoiceDao.test(internalCallContext);
 
         final NonEntityDao nonEntityDao = new DefaultNonEntityDao(dbi);
         invoiceItemSqlDao = dbi.onDemand(InvoiceItemSqlDao.class);
@@ -107,7 +104,7 @@ public class TestChargeBacks extends InvoiceTestSuiteWithEmbeddedDB {
 
     @Test(groups = "slow")
     public void testCompleteChargeBack() throws InvoiceApiException {
-        final Invoice invoice = createAndPersistInvoice(invoiceSqlDao, invoiceItemSqlDao, clock, THIRTY, CURRENCY, callContext, internalCallContextFactory);
+        final Invoice invoice = createAndPersistInvoice(invoiceDao,  clock, THIRTY, CURRENCY, internalCallContext);
         final InvoicePayment payment = createAndPersistPayment(invoiceApi, clock, invoice.getId(), THIRTY, CURRENCY, internalCallContext);
 
         // create a full charge back
@@ -120,7 +117,7 @@ public class TestChargeBacks extends InvoiceTestSuiteWithEmbeddedDB {
 
     @Test(groups = "slow")
     public void testPartialChargeBack() throws InvoiceApiException {
-        final Invoice invoice = createAndPersistInvoice(invoiceSqlDao, invoiceItemSqlDao, clock, THIRTY, CURRENCY, callContext, internalCallContextFactory);
+        final Invoice invoice = createAndPersistInvoice(invoiceDao,  clock, THIRTY, CURRENCY, internalCallContext);
         final InvoicePayment payment = createAndPersistPayment(invoiceApi, clock, invoice.getId(), THIRTY, CURRENCY, internalCallContext);
 
         // create a partial charge back
@@ -134,7 +131,7 @@ public class TestChargeBacks extends InvoiceTestSuiteWithEmbeddedDB {
     @Test(groups = "slow", expectedExceptions = InvoiceApiException.class)
     public void testChargeBackLargerThanPaymentAmount() throws InvoiceApiException {
         try {
-            final Invoice invoice = createAndPersistInvoice(invoiceSqlDao, invoiceItemSqlDao, clock, THIRTY, CURRENCY, callContext, internalCallContextFactory);
+            final Invoice invoice = createAndPersistInvoice(invoiceDao,  clock, THIRTY, CURRENCY, internalCallContext);
             final InvoicePayment payment = createAndPersistPayment(invoiceApi, clock, invoice.getId(), THIRTY, CURRENCY, internalCallContext);
 
             // create a large charge back
@@ -148,7 +145,7 @@ public class TestChargeBacks extends InvoiceTestSuiteWithEmbeddedDB {
     @Test(groups = "slow", expectedExceptions = InvoiceApiException.class)
     public void testNegativeChargeBackAmount() throws InvoiceApiException {
         try {
-            final Invoice invoice = createAndPersistInvoice(invoiceSqlDao, invoiceItemSqlDao, clock, THIRTY, CURRENCY, callContext, internalCallContextFactory);
+            final Invoice invoice = createAndPersistInvoice(invoiceDao,  clock, THIRTY, CURRENCY, internalCallContext);
             final InvoicePayment payment = createAndPersistPayment(invoiceApi, clock, invoice.getId(), THIRTY, CURRENCY, internalCallContext);
 
             // create a partial charge back
@@ -160,7 +157,7 @@ public class TestChargeBacks extends InvoiceTestSuiteWithEmbeddedDB {
 
     @Test(groups = "slow")
     public void testGetAccountIdFromPaymentIdHappyPath() throws InvoiceApiException {
-        final Invoice invoice = createAndPersistInvoice(invoiceSqlDao, invoiceItemSqlDao, clock, THIRTY, CURRENCY, callContext, internalCallContextFactory);
+        final Invoice invoice = createAndPersistInvoice(invoiceDao,  clock, THIRTY, CURRENCY, internalCallContext);
         final InvoicePayment payment = createAndPersistPayment(invoiceApi, clock, invoice.getId(), THIRTY, CURRENCY, internalCallContext);
         final UUID accountId = invoicePaymentApi.getAccountIdFromInvoicePaymentId(payment.getId(), callContext);
         assertEquals(accountId, invoice.getAccountId());
@@ -186,7 +183,7 @@ public class TestChargeBacks extends InvoiceTestSuiteWithEmbeddedDB {
 
     @Test(groups = "slow")
     public void testGetChargeBacksByAccountIdHappyPath() throws InvoiceApiException {
-        final Invoice invoice = createAndPersistInvoice(invoiceSqlDao, invoiceItemSqlDao, clock, THIRTY, CURRENCY, callContext, internalCallContextFactory);
+        final Invoice invoice = createAndPersistInvoice(invoiceDao,  clock, THIRTY, CURRENCY, internalCallContext);
         final InvoicePayment payment = createAndPersistPayment(invoiceApi, clock, invoice.getId(), THIRTY, CURRENCY, internalCallContext);
 
         // create a partial charge back
@@ -207,7 +204,7 @@ public class TestChargeBacks extends InvoiceTestSuiteWithEmbeddedDB {
 
     @Test(groups = "slow")
     public void testGetChargeBacksByInvoicePaymentIdHappyPath() throws InvoiceApiException {
-        final Invoice invoice = createAndPersistInvoice(invoiceSqlDao, invoiceItemSqlDao, clock, THIRTY, CURRENCY, callContext, internalCallContextFactory);
+        final Invoice invoice = createAndPersistInvoice(invoiceDao,  clock, THIRTY, CURRENCY, internalCallContext);
         final InvoicePayment payment = createAndPersistPayment(invoiceApi, clock, invoice.getId(), THIRTY, CURRENCY, internalCallContext);
 
         // create a partial charge back
diff --git a/util/src/test/java/com/ning/billing/GuicyKillbillTestNoDBModule.java b/util/src/test/java/com/ning/billing/GuicyKillbillTestNoDBModule.java
new file mode 100644
index 0000000..265f94e
--- /dev/null
+++ b/util/src/test/java/com/ning/billing/GuicyKillbillTestNoDBModule.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2010-2013 Ning, Inc.
+ *
+ * Ning 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
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing;
+
+
+import org.mockito.Mockito;
+import org.skife.jdbi.v2.IDBI;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.ning.billing.dbi.DBTestingHelper;
+import com.ning.billing.dbi.H2TestingHelper;
+import com.ning.billing.dbi.MysqlTestingHelper;
+
+public class GuicyKillbillTestNoDBModule extends GuicyKillbillTestModule {
+
+    private final static Logger log = LoggerFactory.getLogger(GuicyKillbillTestNoDBModule.class);
+
+    private void installDBI() {
+        final IDBI idbi = Mockito.mock(IDBI.class);
+        bind(IDBI.class).toInstance(idbi);
+    }
+
+    @Override
+    protected void configure() {
+        super.configure();
+        installDBI();
+    }
+}