killbill-uncached

analytics: update tests to new conventions See #38. Signed-off-by:

2/18/2013 8:20:23 PM

Changes

analytics/src/test/java/com/ning/billing/analytics/AnalyticsTestModule.java 80(+0 -80)

Details

diff --git a/analytics/pom.xml b/analytics/pom.xml
index c6dbd2f..d67c2f3 100644
--- a/analytics/pom.xml
+++ b/analytics/pom.xml
@@ -15,7 +15,8 @@
   ~ under the License.
   -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>com.ning.billing</groupId>
@@ -132,6 +133,11 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>com.jayway.awaitility</groupId>
+            <artifactId>awaitility</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-mxj</artifactId>
             <scope>test</scope>
diff --git a/analytics/src/main/java/com/ning/billing/analytics/api/DefaultAnalyticsService.java b/analytics/src/main/java/com/ning/billing/analytics/api/DefaultAnalyticsService.java
index 410c312..7fa573d 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/api/DefaultAnalyticsService.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/api/DefaultAnalyticsService.java
@@ -53,4 +53,13 @@ public class DefaultAnalyticsService implements AnalyticsService {
             log.error("Unable to register to the EventBus!", e);
         }
     }
+
+    @LifecycleHandlerType(LifecycleHandlerType.LifecycleLevel.UNREGISTER_EVENTS)
+    public void unregisterForNotifications() {
+        try {
+            eventBus.unregister(listener);
+        } catch (InternalBus.EventBusException e) {
+            throw new RuntimeException("Unable to unregister to the EventBus!", e);
+        }
+    }
 }
diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionDao.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionDao.java
index 6eeecfc..80765e7 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionDao.java
@@ -38,7 +38,6 @@ import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.util.callcontext.InternalCallContext;
-import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 import com.ning.billing.util.events.SubscriptionInternalEvent;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
@@ -54,19 +53,16 @@ public class BusinessSubscriptionTransitionDao {
     private final EntitlementInternalApi entitlementApi;
     private final AccountInternalApi accountApi;
     private final CatalogService catalogService;
-    private final Clock clock;
 
     @Inject
     public BusinessSubscriptionTransitionDao(final BusinessSubscriptionTransitionSqlDao sqlDao,
                                              final CatalogService catalogService,
                                              final EntitlementInternalApi entitlementApi,
-                                             final AccountInternalApi accountApi,
-                                             final Clock clock) {
+                                             final AccountInternalApi accountApi) {
         this.sqlDao = sqlDao;
         this.catalogService = catalogService;
         this.entitlementApi = entitlementApi;
         this.accountApi = accountApi;
-        this.clock = clock;
     }
 
     public void rebuildTransitionsForBundle(final UUID bundleId, final InternalCallContext context) {
diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessOverdueStatusModelDao.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessOverdueStatusModelDao.java
index 5fcb313..275a690 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessOverdueStatusModelDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessOverdueStatusModelDao.java
@@ -18,6 +18,8 @@ package com.ning.billing.analytics.model;
 
 import java.util.UUID;
 
+import javax.annotation.Nullable;
+
 import org.joda.time.DateTime;
 
 import com.ning.billing.util.entity.EntityBase;
@@ -31,7 +33,7 @@ public class BusinessOverdueStatusModelDao extends EntityBase {
     private final DateTime startDate;
     private final DateTime endDate;
 
-    public BusinessOverdueStatusModelDao(final String accountKey, final UUID bundleId, final DateTime endDate,
+    public BusinessOverdueStatusModelDao(final String accountKey, final UUID bundleId, @Nullable final DateTime endDate,
                                          final String externalKey, final DateTime startDate, final String status) {
         this.accountKey = accountKey;
         this.bundleId = bundleId;
diff --git a/analytics/src/main/java/com/ning/billing/analytics/setup/AnalyticsModule.java b/analytics/src/main/java/com/ning/billing/analytics/setup/AnalyticsModule.java
index eca1be6..dfedeeb 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/setup/AnalyticsModule.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/setup/AnalyticsModule.java
@@ -28,6 +28,7 @@ import com.ning.billing.analytics.api.user.AnalyticsUserApi;
 import com.ning.billing.analytics.api.user.DefaultAnalyticsUserApi;
 import com.ning.billing.analytics.dao.AnalyticsDao;
 import com.ning.billing.analytics.dao.AnalyticsSanityDao;
+import com.ning.billing.analytics.dao.BusinessAccountFieldSqlDao;
 import com.ning.billing.analytics.dao.BusinessAccountSqlDao;
 import com.ning.billing.analytics.dao.BusinessAccountTagSqlDao;
 import com.ning.billing.analytics.dao.BusinessInvoiceFieldSqlDao;
@@ -51,8 +52,37 @@ public class AnalyticsModule extends AbstractModule {
 
     @Override
     protected void configure() {
+        installAnalyticsUserApi();
+        installAnalyticsSanityApi();
+
+        installAnalyticsDao();
+        installAnalyticsSqlDao();
+
+        bind(AnalyticsListener.class).asEagerSingleton();
+        bind(AnalyticsService.class).to(DefaultAnalyticsService.class).asEagerSingleton();
+    }
+
+    protected void installAnalyticsUserApi() {
+        bind(DefaultAnalyticsUserApi.class).asEagerSingleton();
+        bind(AnalyticsUserApi.class).to(DefaultAnalyticsUserApi.class).asEagerSingleton();
+    }
+
+    protected void installAnalyticsSanityApi() {
+        bind(AnalyticsSanityApi.class).to(DefaultAnalyticsSanityApi.class).asEagerSingleton();
+    }
+
+    protected void installAnalyticsDao() {
+        bind(AnalyticsDao.class).to(DefaultAnalyticsDao.class).asEagerSingleton();
+        bind(AnalyticsSanityDao.class).to(DefaultAnalyticsSanityDao.class).asEagerSingleton();
+        bind(BusinessSubscriptionTransitionDao.class).asEagerSingleton();
+        bind(BusinessAccountDao.class).asEagerSingleton();
+        bind(BusinessTagDao.class).asEagerSingleton();
+    }
+
+    protected void installAnalyticsSqlDao() {
         bind(BusinessAccountSqlDao.class).toProvider(new BusinessSqlProvider<BusinessAccountSqlDao>(BusinessAccountSqlDao.class));
         bind(BusinessAccountTagSqlDao.class).toProvider(new BusinessSqlProvider<BusinessAccountTagSqlDao>(BusinessAccountTagSqlDao.class));
+        bind(BusinessAccountFieldSqlDao.class).toProvider(new BusinessSqlProvider<BusinessAccountFieldSqlDao>(BusinessAccountFieldSqlDao.class));
         bind(BusinessInvoiceFieldSqlDao.class).toProvider(new BusinessSqlProvider<BusinessInvoiceFieldSqlDao>(BusinessInvoiceFieldSqlDao.class));
         bind(BusinessInvoiceItemSqlDao.class).toProvider(new BusinessSqlProvider<BusinessInvoiceItemSqlDao>(BusinessInvoiceItemSqlDao.class));
         bind(BusinessInvoicePaymentFieldSqlDao.class).toProvider(new BusinessSqlProvider<BusinessInvoicePaymentFieldSqlDao>(BusinessInvoicePaymentFieldSqlDao.class));
@@ -64,18 +94,5 @@ public class AnalyticsModule extends AbstractModule {
         bind(BusinessSubscriptionTransitionFieldSqlDao.class).toProvider(new BusinessSqlProvider<BusinessSubscriptionTransitionFieldSqlDao>(BusinessSubscriptionTransitionFieldSqlDao.class));
         bind(BusinessSubscriptionTransitionSqlDao.class).toProvider(new BusinessSqlProvider<BusinessSubscriptionTransitionSqlDao>(BusinessSubscriptionTransitionSqlDao.class));
         bind(BusinessSubscriptionTransitionTagSqlDao.class).toProvider(new BusinessSqlProvider<BusinessSubscriptionTransitionTagSqlDao>(BusinessSubscriptionTransitionTagSqlDao.class));
-
-        bind(BusinessSubscriptionTransitionDao.class).asEagerSingleton();
-        bind(BusinessAccountDao.class).asEagerSingleton();
-        bind(BusinessTagDao.class).asEagerSingleton();
-        bind(AnalyticsListener.class).asEagerSingleton();
-
-        bind(AnalyticsDao.class).to(DefaultAnalyticsDao.class).asEagerSingleton();
-        bind(AnalyticsSanityDao.class).to(DefaultAnalyticsSanityDao.class).asEagerSingleton();
-        bind(AnalyticsService.class).to(DefaultAnalyticsService.class).asEagerSingleton();
-
-        bind(DefaultAnalyticsUserApi.class).asEagerSingleton();
-        bind(AnalyticsSanityApi.class).to(DefaultAnalyticsSanityApi.class).asEagerSingleton();
-        bind(AnalyticsUserApi.class).to(DefaultAnalyticsUserApi.class).asEagerSingleton();
     }
 }
diff --git a/analytics/src/test/java/com/ning/billing/analytics/AnalyticsTestSuiteNoDB.java b/analytics/src/test/java/com/ning/billing/analytics/AnalyticsTestSuiteNoDB.java
new file mode 100644
index 0000000..c31930e
--- /dev/null
+++ b/analytics/src/test/java/com/ning/billing/analytics/AnalyticsTestSuiteNoDB.java
@@ -0,0 +1,139 @@
+/*
+ * 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.analytics;
+
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+
+import com.ning.billing.GuicyKillbillTestSuiteNoDB;
+import com.ning.billing.account.api.AccountUserApi;
+import com.ning.billing.analytics.api.DefaultAnalyticsService;
+import com.ning.billing.analytics.api.user.AnalyticsUserApi;
+import com.ning.billing.analytics.dao.BusinessAccountFieldSqlDao;
+import com.ning.billing.analytics.dao.BusinessAccountSqlDao;
+import com.ning.billing.analytics.dao.BusinessAccountTagSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoiceFieldSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoiceItemSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoicePaymentFieldSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoicePaymentSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoicePaymentTagSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoiceSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoiceTagSqlDao;
+import com.ning.billing.analytics.dao.BusinessOverdueStatusSqlDao;
+import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionFieldSqlDao;
+import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionSqlDao;
+import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionTagSqlDao;
+import com.ning.billing.analytics.glue.TestAnalyticsModuleNoDB;
+import com.ning.billing.catalog.api.CatalogService;
+import com.ning.billing.entitlement.api.user.EntitlementUserApi;
+import com.ning.billing.invoice.api.InvoiceUserApi;
+import com.ning.billing.invoice.dao.InvoiceDao;
+import com.ning.billing.payment.dao.PaymentDao;
+import com.ning.billing.util.glue.RealImplementation;
+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.svcsapi.bus.InternalBus;
+
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+
+public abstract class AnalyticsTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
+
+    @Inject
+    @RealImplementation
+    protected AccountUserApi accountApi;
+    @Inject
+    protected AccountInternalApi accountInternalApi;
+    @Inject
+    protected AnalyticsUserApi analyticsUserApi;
+    @Inject
+    protected CatalogService catalogService;
+    @Inject
+    @RealImplementation
+    protected EntitlementUserApi entitlementApi;
+    @Inject
+    protected EntitlementInternalApi entitlementInternalApi;
+    @Inject
+    protected InvoiceUserApi invoiceApi;
+    @Inject
+    protected InvoiceDao realInvoiceDao;
+    @Inject
+    protected InvoiceInternalApi invoiceInternalApi;
+    @Inject
+    protected PaymentDao paymentDao;
+    @Inject
+    protected DefaultAnalyticsService service;
+    @Inject
+    protected InternalBus bus;
+    @Inject
+    protected BusinessAccountDao accountDao;
+    @Inject
+    protected BusinessAccountSqlDao accountSqlDao;
+    @Inject
+    protected BusinessAccountFieldSqlDao accountFieldSqlDao;
+    @Inject
+    protected BusinessAccountTagSqlDao accountTagSqlDao;
+    @Inject
+    protected BusinessInvoiceFieldSqlDao invoiceFieldSqlDao;
+    @Inject
+    protected BusinessInvoiceItemSqlDao invoiceItemSqlDao;
+    @Inject
+    protected BusinessInvoicePaymentFieldSqlDao invoicePaymentFieldSqlDao;
+    @Inject
+    protected BusinessInvoicePaymentSqlDao invoicePaymentSqlDao;
+    @Inject
+    protected BusinessInvoicePaymentTagSqlDao invoicePaymentTagSqlDao;
+    @Inject
+    protected BusinessInvoiceDao invoiceDao;
+    @Inject
+    protected BusinessInvoiceSqlDao invoiceSqlDao;
+    @Inject
+    protected BusinessInvoiceTagSqlDao invoiceTagSqlDao;
+    @Inject
+    protected BusinessOverdueStatusDao overdueStatusDao;
+    @Inject
+    protected BusinessOverdueStatusSqlDao overdueStatusSqlDao;
+    @Inject
+    protected BusinessSubscriptionTransitionFieldSqlDao subscriptionTransitionFieldSqlDao;
+    @Inject
+    protected BusinessSubscriptionTransitionTagSqlDao subscriptionTransitionTagSqlDao;
+    @Inject
+    protected BusinessSubscriptionTransitionDao subscriptionTransitionDao;
+    @Inject
+    protected BusinessSubscriptionTransitionSqlDao subscriptionTransitionSqlDao;
+    @Inject
+    protected BusinessTagDao tagDao;
+
+    @BeforeClass(groups = "fast")
+    protected void setup() throws Exception {
+        final Injector injector = Guice.createInjector(new TestAnalyticsModuleNoDB());
+        injector.injectMembers(this);
+    }
+
+    @BeforeMethod(groups = "fast")
+    public void setupTest() {
+        bus.start();
+    }
+
+    @AfterMethod(groups = "fast")
+    public void cleanupTest() {
+        bus.stop();
+    }
+}
diff --git a/analytics/src/test/java/com/ning/billing/analytics/AnalyticsTestSuiteWithEmbeddedDB.java b/analytics/src/test/java/com/ning/billing/analytics/AnalyticsTestSuiteWithEmbeddedDB.java
index e545192..6541125 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/AnalyticsTestSuiteWithEmbeddedDB.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/AnalyticsTestSuiteWithEmbeddedDB.java
@@ -16,7 +16,137 @@
 
 package com.ning.billing.analytics;
 
-import com.ning.billing.KillbillTestSuiteWithEmbeddedDB;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
 
-public abstract class AnalyticsTestSuiteWithEmbeddedDB extends KillbillTestSuiteWithEmbeddedDB {
+import com.ning.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
+import com.ning.billing.account.api.AccountUserApi;
+import com.ning.billing.analytics.api.AnalyticsService;
+import com.ning.billing.analytics.api.DefaultAnalyticsService;
+import com.ning.billing.analytics.api.user.AnalyticsUserApi;
+import com.ning.billing.analytics.dao.BusinessAccountFieldSqlDao;
+import com.ning.billing.analytics.dao.BusinessAccountSqlDao;
+import com.ning.billing.analytics.dao.BusinessAccountTagSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoiceFieldSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoiceItemSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoicePaymentFieldSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoicePaymentSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoicePaymentTagSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoiceSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoiceTagSqlDao;
+import com.ning.billing.analytics.dao.BusinessOverdueStatusSqlDao;
+import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionFieldSqlDao;
+import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionSqlDao;
+import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionTagSqlDao;
+import com.ning.billing.analytics.glue.TestAnalyticsModuleWithEmbeddedDB;
+import com.ning.billing.catalog.api.CatalogService;
+import com.ning.billing.entitlement.api.user.EntitlementUserApi;
+import com.ning.billing.invoice.api.InvoiceUserApi;
+import com.ning.billing.invoice.dao.InvoiceDao;
+import com.ning.billing.payment.dao.PaymentDao;
+import com.ning.billing.util.glue.RealImplementation;
+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.svcsapi.bus.InternalBus;
+
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+
+public abstract class AnalyticsTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteWithEmbeddedDB {
+
+    @Inject
+    @RealImplementation
+    protected AccountUserApi accountApi;
+    @Inject
+    protected AccountInternalApi accountInternalApi;
+    @Inject
+    protected AnalyticsUserApi analyticsUserApi;
+    @Inject
+    protected AnalyticsService analyticsService;
+    @Inject
+    protected CatalogService catalogService;
+    @Inject
+    @RealImplementation
+    protected EntitlementUserApi entitlementApi;
+    @Inject
+    protected EntitlementInternalApi entitlementInternalApi;
+    @Inject
+    protected InvoiceUserApi invoiceApi;
+    @Inject
+    protected InvoiceDao realInvoiceDao;
+    @Inject
+    protected InvoiceInternalApi invoiceInternalApi;
+    @Inject
+    protected PaymentDao paymentDao;
+    @Inject
+    protected DefaultAnalyticsService service;
+    @Inject
+    protected InternalBus bus;
+    @Inject
+    protected BusinessAccountDao accountDao;
+    @Inject
+    protected BusinessAccountSqlDao accountSqlDao;
+    @Inject
+    protected BusinessAccountFieldSqlDao accountFieldSqlDao;
+    @Inject
+    protected BusinessAccountTagSqlDao accountTagSqlDao;
+    @Inject
+    protected BusinessInvoiceFieldSqlDao invoiceFieldSqlDao;
+    @Inject
+    protected BusinessInvoiceItemSqlDao invoiceItemSqlDao;
+    @Inject
+    protected BusinessInvoicePaymentFieldSqlDao invoicePaymentFieldSqlDao;
+    @Inject
+    protected BusinessInvoicePaymentSqlDao invoicePaymentSqlDao;
+    @Inject
+    protected BusinessInvoicePaymentTagSqlDao invoicePaymentTagSqlDao;
+    @Inject
+    protected BusinessInvoiceDao invoiceDao;
+    @Inject
+    protected BusinessInvoiceSqlDao invoiceSqlDao;
+    @Inject
+    protected BusinessInvoiceTagSqlDao invoiceTagSqlDao;
+    @Inject
+    protected BusinessOverdueStatusDao overdueStatusDao;
+    @Inject
+    protected BusinessOverdueStatusSqlDao overdueStatusSqlDao;
+    @Inject
+    protected BusinessSubscriptionTransitionFieldSqlDao subscriptionTransitionFieldSqlDao;
+    @Inject
+    protected BusinessSubscriptionTransitionTagSqlDao subscriptionTransitionTagSqlDao;
+    @Inject
+    protected BusinessSubscriptionTransitionDao subscriptionTransitionDao;
+    @Inject
+    protected BusinessSubscriptionTransitionSqlDao subscriptionTransitionSqlDao;
+    @Inject
+    protected BusinessTagDao tagDao;
+
+    @BeforeClass(groups = "slow")
+    protected void setup() throws Exception {
+        final Injector injector = Guice.createInjector(new TestAnalyticsModuleWithEmbeddedDB());
+        injector.injectMembers(this);
+    }
+
+    @BeforeMethod(groups = "slow")
+    public void setupTest() throws Exception {
+        bus.start();
+        restartAnalyticsService();
+    }
+
+    @AfterMethod(groups = "slow")
+    public void cleanupTest() throws Exception {
+        bus.stop();
+        stopAnalyticsService();
+    }
+
+    private void restartAnalyticsService() throws Exception {
+        ((DefaultAnalyticsService) analyticsService).registerForNotifications();
+    }
+
+    private void stopAnalyticsService() throws Exception {
+        ((DefaultAnalyticsService) analyticsService).unregisterForNotifications();
+    }
 }
diff --git a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
index 71741b5..411a66e 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
@@ -16,38 +16,26 @@
 
 package com.ning.billing.analytics.api;
 
-import java.io.IOException;
 import java.math.BigDecimal;
-import java.sql.SQLException;
-import java.util.List;
 import java.util.UUID;
+import java.util.concurrent.Callable;
 
 import org.joda.time.DateTime;
 import org.mockito.Mockito;
 import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
 
 import com.ning.billing.account.api.Account;
-import com.ning.billing.account.api.AccountUserApi;
+import com.ning.billing.account.api.AccountApiException;
 import com.ning.billing.account.api.user.DefaultAccountCreationEvent;
 import com.ning.billing.account.dao.AccountModelDao;
-import com.ning.billing.analytics.AnalyticsTestModule;
 import com.ning.billing.analytics.AnalyticsTestSuiteWithEmbeddedDB;
 import com.ning.billing.analytics.MockDuration;
 import com.ning.billing.analytics.MockPhase;
 import com.ning.billing.analytics.MockProduct;
-import com.ning.billing.analytics.dao.BusinessAccountSqlDao;
-import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionSqlDao;
-import com.ning.billing.analytics.model.BusinessSubscription;
-import com.ning.billing.analytics.model.BusinessSubscriptionEvent;
-import com.ning.billing.analytics.model.BusinessSubscriptionTransitionModelDao;
+import com.ning.billing.catalog.MockCatalog;
 import com.ning.billing.catalog.MockPriceList;
-import com.ning.billing.catalog.api.Catalog;
-import com.ning.billing.catalog.api.CatalogApiException;
-import com.ning.billing.catalog.api.CatalogService;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.Plan;
@@ -55,22 +43,16 @@ import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.catalog.api.PriceList;
 import com.ning.billing.catalog.api.Product;
 import com.ning.billing.catalog.api.ProductCategory;
+import com.ning.billing.entitlement.api.SubscriptionTransitionType;
 import com.ning.billing.entitlement.api.user.DefaultEffectiveSubscriptionEvent;
-import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.entitlement.api.user.SubscriptionTransitionData;
 import com.ning.billing.entitlement.events.EntitlementEvent;
 import com.ning.billing.entitlement.events.user.ApiEventType;
-import com.ning.billing.invoice.api.InvoiceItem;
-import com.ning.billing.invoice.api.InvoicePayment;
+import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.user.DefaultInvoiceCreationEvent;
-import com.ning.billing.invoice.dao.InvoiceDao;
-import com.ning.billing.invoice.dao.InvoiceItemModelDao;
-import com.ning.billing.invoice.dao.InvoiceModelDao;
-import com.ning.billing.invoice.dao.InvoiceModelDaoHelper;
-import com.ning.billing.invoice.dao.InvoicePaymentModelDao;
 import com.ning.billing.invoice.model.DefaultInvoice;
 import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
 import com.ning.billing.mock.MockAccountBuilder;
@@ -78,26 +60,18 @@ import com.ning.billing.mock.MockPlan;
 import com.ning.billing.payment.api.DefaultPaymentInfoEvent;
 import com.ning.billing.payment.api.PaymentMethod;
 import com.ning.billing.payment.api.PaymentStatus;
-import com.ning.billing.payment.dao.PaymentAttemptModelDao;
-import com.ning.billing.payment.dao.PaymentDao;
-import com.ning.billing.payment.dao.PaymentModelDao;
-import com.ning.billing.util.clock.Clock;
-import com.ning.billing.util.clock.DefaultClock;
+import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.events.AccountCreationInternalEvent;
 import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 import com.ning.billing.util.events.InvoiceCreationInternalEvent;
 import com.ning.billing.util.events.PaymentInfoInternalEvent;
-import com.ning.billing.util.svcsapi.bus.InternalBus;
 
-import com.google.common.base.Function;
-import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.inject.Inject;
 
+import static com.jayway.awaitility.Awaitility.await;
+import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.testng.Assert.fail;
 
-@Guice(modules = {AnalyticsTestModule.class})
 public class TestAnalyticsService extends AnalyticsTestSuiteWithEmbeddedDB {
 
     final Product product = new MockProduct("platinum", "subscription", ProductCategory.BASE);
@@ -105,62 +79,23 @@ public class TestAnalyticsService extends AnalyticsTestSuiteWithEmbeddedDB {
     final PlanPhase phase = new MockPhase(PhaseType.EVERGREEN, plan, MockDuration.UNLIMITED(), 25.95);
 
     private static final Long TOTAL_ORDERING = 11L;
-    private static final String BUNDLE_EXTERNAL_KEY = UUID.randomUUID().toString();
-    private static final UUID ACCOUNT_ID = UUID.randomUUID();
-    private static final String ACCOUNT_KEY = UUID.randomUUID().toString();
+    private final String ACCOUNT_KEY = UUID.randomUUID().toString();
+    private final String BUNDLE_KEY = UUID.randomUUID().toString();
     private static final Currency ACCOUNT_CURRENCY = Currency.EUR;
     private static final BigDecimal INVOICE_AMOUNT = BigDecimal.valueOf(1243.11);
-
-    private final Clock clock = new DefaultClock();
-
-    @Inject
-    private AccountUserApi accountApi;
-
-    @Inject
-    private EntitlementUserApi entitlementApi;
-
-    @Inject
-    private InvoiceDao invoiceDao;
-
-    @Inject
-    private PaymentDao paymentDao;
-
-    @Inject
-    private DefaultAnalyticsService service;
-
-    @Inject
-    private InternalBus bus;
-
-    @Inject
-    private BusinessSubscriptionTransitionSqlDao subscriptionSqlDao;
-
-    @Inject
-    private BusinessAccountSqlDao accountSqlDao;
+    private final UUID bundleId = UUID.randomUUID();
+    private final UUID subscriptionId = UUID.randomUUID();
 
     private EffectiveSubscriptionInternalEvent transition;
-    private BusinessSubscriptionTransitionModelDao expectedTransition;
 
     private AccountCreationInternalEvent accountCreationNotification;
     private InvoiceCreationInternalEvent invoiceCreationNotification;
     private PaymentInfoInternalEvent paymentInfoNotification;
 
-    @Inject
-    private CatalogService catalogService;
-
-    private Catalog catalog;
-
-    @BeforeClass(groups = "slow")
-    public void setUp() throws IOException, ClassNotFoundException, SQLException, EntitlementUserApiException, CatalogApiException {
-        catalog = catalogService.getFullCatalog();
-        Mockito.when(catalog.findPlan(Mockito.anyString(), Mockito.<DateTime>any())).thenReturn(plan);
-        Mockito.when(catalog.findPhase(Mockito.anyString(), Mockito.<DateTime>any(), Mockito.<DateTime>any())).thenReturn(phase);
-
-        // Killbill generic setup
-        bus.start();
-    }
-
     @BeforeMethod(groups = "slow")
-    public void createMocks() {
+    public void createMocks() throws AccountApiException {
+        Mockito.when(catalogService.getFullCatalog()).thenReturn(new MockCatalog());
+
         final PaymentMethod paymentMethod = Mockito.mock(PaymentMethod.class);
         final UUID paymentMethodId = UUID.randomUUID();
         Mockito.when(paymentMethod.getId()).thenReturn(paymentMethodId);
@@ -169,36 +104,46 @@ public class TestAnalyticsService extends AnalyticsTestSuiteWithEmbeddedDB {
                 .currency(ACCOUNT_CURRENCY)
                 .paymentMethodId(paymentMethodId)
                 .build();
+        Mockito.when(accountInternalApi.getAccountById(Mockito.eq(account.getId()), Mockito.<InternalCallContext>any())).thenReturn(account);
 
         try {
-            final Account storedAccount = accountApi.createAccount(account, callContext);
-
             // Create events for the bus and expected results
-            createSubscriptionTransitionEvent(storedAccount);
-            createAccountCreationEvent(storedAccount);
-            createInvoiceAndPaymentCreationEvents(storedAccount);
+            createSubscriptionTransitionEvent(account);
+            createAccountCreationEvent(account);
+            createInvoiceAndPaymentCreationEvents(account);
         } catch (Throwable t) {
             fail("Initializing accounts failed.", t);
         }
     }
 
     private void createSubscriptionTransitionEvent(final Account account) throws EntitlementUserApiException {
-        final SubscriptionBundle bundle = entitlementApi.createBundleForAccount(account.getId(), BUNDLE_EXTERNAL_KEY, callContext);
-
-        // Verify we correctly initialized the account subsystem
-        Assert.assertNotNull(bundle);
-        Assert.assertEquals(bundle.getExternalKey(), BUNDLE_EXTERNAL_KEY);
-
-        // Create a subscription transition event
-        final UUID subscriptionId = UUID.randomUUID();
         final DateTime effectiveTransitionTime = clock.getUTCNow();
         final DateTime requestedTransitionTime = clock.getUTCNow();
         final PriceList priceList = new MockPriceList().setName("something");
 
+        final SubscriptionBundle bundle = Mockito.mock(SubscriptionBundle.class);
+        Mockito.when(bundle.getId()).thenReturn(bundleId);
+        Mockito.when(bundle.getAccountId()).thenReturn(account.getId());
+        Mockito.when(bundle.getExternalKey()).thenReturn(BUNDLE_KEY);
+        Mockito.when(entitlementInternalApi.getBundleFromId(Mockito.eq(bundleId), Mockito.<InternalCallContext>any())).thenReturn(bundle);
+
+        final Subscription subscription = Mockito.mock(Subscription.class);
+        Mockito.when(subscription.getId()).thenReturn(subscriptionId);
+        Mockito.when(subscription.getBundleId()).thenReturn(bundleId);
+        Mockito.when(entitlementInternalApi.getSubscriptionFromId(Mockito.eq(subscriptionId), Mockito.<InternalCallContext>any())).thenReturn(subscription);
+        Mockito.when(entitlementInternalApi.getSubscriptionsForBundle(Mockito.eq(bundleId), Mockito.<InternalCallContext>any())).thenReturn(ImmutableList.<Subscription>of(subscription));
+
+        final EffectiveSubscriptionInternalEvent event = Mockito.mock(EffectiveSubscriptionInternalEvent.class);
+        Mockito.when(event.getEffectiveTransitionTime()).thenReturn(effectiveTransitionTime);
+        Mockito.when(event.getRequestedTransitionTime()).thenReturn(requestedTransitionTime);
+        Mockito.when(event.getTransitionType()).thenReturn(SubscriptionTransitionType.CREATE);
+        Mockito.when(entitlementInternalApi.getAllTransitions(Mockito.eq(subscription), Mockito.<InternalCallContext>any())).thenReturn(ImmutableList.<EffectiveSubscriptionInternalEvent>of(event));
+
+        // Create a subscription transition event
         transition = new DefaultEffectiveSubscriptionEvent(new SubscriptionTransitionData(
                 UUID.randomUUID(),
                 subscriptionId,
-                bundle.getId(),
+                bundleId,
                 EntitlementEvent.EventType.API_USER,
                 ApiEventType.CREATE,
                 requestedTransitionTime,
@@ -214,18 +159,6 @@ public class TestAnalyticsService extends AnalyticsTestSuiteWithEmbeddedDB {
                 TOTAL_ORDERING,
                 null,
                 true), null, null, 1L, 1L);
-        expectedTransition = new BusinessSubscriptionTransitionModelDao(
-                TOTAL_ORDERING,
-                transition.getBundleId(),
-                BUNDLE_EXTERNAL_KEY,
-                ACCOUNT_ID,
-                ACCOUNT_KEY,
-                transition.getSubscriptionId(),
-                requestedTransitionTime,
-                BusinessSubscriptionEvent.subscriptionCreated(plan.getName(), catalog, clock.getUTCNow(), clock.getUTCNow()),
-                null,
-                new BusinessSubscription(priceList.getName(), plan.getName(), phase.getName(), ACCOUNT_CURRENCY, effectiveTransitionTime, Subscription.SubscriptionState.ACTIVE, catalog)
-        );
     }
 
     private void createAccountCreationEvent(final Account account) {
@@ -234,90 +167,65 @@ public class TestAnalyticsService extends AnalyticsTestSuiteWithEmbeddedDB {
 
     private void createInvoiceAndPaymentCreationEvents(final Account account) {
         final DefaultInvoice invoice = new DefaultInvoice(account.getId(), clock.getUTCToday(), clock.getUTCToday(), ACCOUNT_CURRENCY);
-        final FixedPriceInvoiceItem invoiceItem = new FixedPriceInvoiceItem(invoice.getId(), account.getId(), UUID.randomUUID(), UUID.randomUUID(), "somePlan", "somePhase", clock.getUTCToday(),
+        final FixedPriceInvoiceItem invoiceItem = new FixedPriceInvoiceItem(invoice.getId(), account.getId(), bundleId, subscriptionId, "somePlan", "somePhase", clock.getUTCToday(),
                                                                             INVOICE_AMOUNT, ACCOUNT_CURRENCY);
         invoice.addInvoiceItem(invoiceItem);
-
-        final InvoiceModelDao invoiceModelDao = new InvoiceModelDao(invoice);
-        final List<InvoiceItemModelDao> invoiceItemModelDaos = ImmutableList.<InvoiceItemModelDao>copyOf(Collections2.transform(invoice.getInvoiceItems(),
-                                                                                                                                new Function<InvoiceItem, InvoiceItemModelDao>() {
-                                                                                                                                    @Override
-                                                                                                                                    public InvoiceItemModelDao apply(final InvoiceItem input) {
-                                                                                                                                        return new InvoiceItemModelDao(input);
-                                                                                                                                    }
-                                                                                                                                }));
-        // Not really needed, there shouldn't be any payment at this stage
-        final List<InvoicePaymentModelDao> invoicePaymentModelDaos = ImmutableList.<InvoicePaymentModelDao>copyOf(Collections2.transform(invoice.getPayments(),
-                                                                                                                                         new Function<InvoicePayment, InvoicePaymentModelDao>() {
-                                                                                                                                             @Override
-                                                                                                                                             public InvoicePaymentModelDao apply(final InvoicePayment input) {
-                                                                                                                                                 return new InvoicePaymentModelDao(input);
-                                                                                                                                             }
-                                                                                                                                         }));
-
-        invoiceDao.createInvoice(invoiceModelDao, invoiceItemModelDaos, invoicePaymentModelDaos, true, ImmutableMap.<UUID, DateTime>of(), internalCallContext);
-        final List<InvoiceModelDao> invoices = invoiceDao.getInvoicesByAccount(account.getId(), internalCallContext);
-        Assert.assertEquals(invoices.size(), 1);
-        Assert.assertEquals(invoices.get(0).getInvoiceItems().size(), 1);
+        Mockito.when(invoiceInternalApi.getInvoicesByAccountId(Mockito.eq(account.getId()), Mockito.<InternalCallContext>any())).thenReturn(ImmutableList.<Invoice>of(invoice));
 
         // It doesn't really matter what the events contain - the listener will go back to the db
         invoiceCreationNotification = new DefaultInvoiceCreationEvent(invoice.getId(), account.getId(),
                                                                       INVOICE_AMOUNT, ACCOUNT_CURRENCY, null, 1L, 1L);
 
-        paymentInfoNotification = new DefaultPaymentInfoEvent(account.getId(), invoices.get(0).getId(), null, InvoiceModelDaoHelper.getBalance(invoices.get(0)), -1,
+        paymentInfoNotification = new DefaultPaymentInfoEvent(account.getId(), invoice.getId(), null, INVOICE_AMOUNT, -1,
                                                               PaymentStatus.UNKNOWN, null, null, null, clock.getUTCNow(), 1L, 1L);
-
-        final PaymentModelDao paymentInfo = new PaymentModelDao(account.getId(), invoice.getId(), account.getPaymentMethodId(),
-                                                                BigDecimal.ONE, Currency.USD, clock.getUTCNow(), PaymentStatus.SUCCESS);
-        final PaymentAttemptModelDao paymentAttempt = new PaymentAttemptModelDao(account.getId(), invoice.getId(), paymentInfo.getId(),
-                                                                                 clock.getUTCNow(), BigDecimal.ONE);
-        paymentDao.insertPaymentWithAttempt(paymentInfo, paymentAttempt, internalCallContext);
-        Assert.assertEquals(paymentDao.getPaymentsForAccount(account.getId(), internalCallContext).size(), 1);
     }
 
-    // Flaky
-    @Test(groups = "slow", enabled = false)
+    @Test(groups = "slow")
     public void testRegisterForNotifications() throws Exception {
         // Make sure the service has been instantiated
         Assert.assertEquals(service.getName(), "analytics-service");
 
-        // Test the bus and make sure we can register our service
-        try {
-            service.registerForNotifications();
-        } catch (Throwable t) {
-            Assert.fail("Unable to start the bus or service! " + t);
-        }
-
         Assert.assertNull(accountSqlDao.getAccountByKey(ACCOUNT_KEY, internalCallContext));
 
         // Send events and wait for the async part...
         bus.post(accountCreationNotification, internalCallContext);
-        Thread.sleep(5000);
-        Assert.assertNotNull(accountSqlDao.getAccountByKey(ACCOUNT_KEY, internalCallContext));
+        waitALittle(new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                return (accountSqlDao.getAccountByKey(ACCOUNT_KEY, internalCallContext) != null);
+            }
+        });
 
         // Test subscriptions integration - this is just to exercise the code. It's hard to test the actual subscriptions
         // as we would need to mock a bunch of APIs (see integration tests in Beatrix instead)
         bus.post(transition, internalCallContext);
-        Thread.sleep(5000);
+        waitALittle(new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                return (subscriptionTransitionSqlDao.getTransitionsForAccount(ACCOUNT_KEY, internalCallContext).size() == 1);
+            }
+        });
 
         // Test invoice integration - the account creation notification has triggered a BAC update
-        Assert.assertEquals(accountSqlDao.getAccountByKey(ACCOUNT_KEY, internalCallContext).getTotalInvoiceBalance().compareTo(INVOICE_AMOUNT), 1);
-
-        // Post the same invoice event again - the invoice balance shouldn't change
         bus.post(invoiceCreationNotification, internalCallContext);
-        Thread.sleep(5000);
-        Assert.assertEquals(accountSqlDao.getAccountByKey(ACCOUNT_KEY, internalCallContext).getTotalInvoiceBalance().compareTo(INVOICE_AMOUNT), 1);
+        waitALittle(new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                // Test invoice integration - the account creation notification has triggered a BAC update
+                return (accountSqlDao.getAccountByKey(ACCOUNT_KEY, internalCallContext).getTotalInvoiceBalance().compareTo(INVOICE_AMOUNT) == 0);
+            }
+        });
 
         // Test payment integration - the fields have already been populated, just make sure the code is exercised
         // It's hard to test the actual payments fields though in bac, since we should mock the plugin
         bus.post(paymentInfoNotification, internalCallContext);
-        Thread.sleep(5000);
+    }
 
-        // Test the shutdown sequence
+    private void waitALittle(final Callable<Boolean> callable) {
         try {
-            bus.stop();
-        } catch (Throwable t) {
-            Assert.fail("Unable to stop the bus!");
+            await().atMost(5, SECONDS).until(callable);
+        } catch (Exception e) {
+            Assert.fail("Exception in TestAnalyticsService", e);
         }
     }
 }
diff --git a/analytics/src/test/java/com/ning/billing/analytics/api/user/TestDefaultAnalyticsUserApi.java b/analytics/src/test/java/com/ning/billing/analytics/api/user/TestDefaultAnalyticsUserApi.java
index 59f043a..977d84b 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/api/user/TestDefaultAnalyticsUserApi.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/api/user/TestDefaultAnalyticsUserApi.java
@@ -21,31 +21,14 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 import org.mockito.Mockito;
-import org.skife.jdbi.v2.IDBI;
 import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.ning.billing.analytics.AnalyticsTestSuiteWithEmbeddedDB;
-import com.ning.billing.analytics.BusinessAccountDao;
-import com.ning.billing.analytics.BusinessInvoiceDao;
-import com.ning.billing.analytics.BusinessInvoicePaymentDao;
-import com.ning.billing.analytics.BusinessOverdueStatusDao;
-import com.ning.billing.analytics.BusinessSubscriptionTransitionDao;
-import com.ning.billing.analytics.BusinessTagDao;
 import com.ning.billing.analytics.MockDuration;
 import com.ning.billing.analytics.MockPhase;
 import com.ning.billing.analytics.MockProduct;
 import com.ning.billing.analytics.api.TimeSeriesData;
-import com.ning.billing.analytics.dao.AnalyticsDao;
-import com.ning.billing.analytics.dao.BusinessAccountSqlDao;
-import com.ning.billing.analytics.dao.BusinessAccountTagSqlDao;
-import com.ning.billing.analytics.dao.BusinessInvoiceItemSqlDao;
-import com.ning.billing.analytics.dao.BusinessInvoicePaymentSqlDao;
-import com.ning.billing.analytics.dao.BusinessInvoiceSqlDao;
-import com.ning.billing.analytics.dao.BusinessOverdueStatusSqlDao;
-import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionSqlDao;
-import com.ning.billing.analytics.dao.DefaultAnalyticsDao;
 import com.ning.billing.analytics.model.BusinessAccountModelDao;
 import com.ning.billing.analytics.model.BusinessSubscription;
 import com.ning.billing.analytics.model.BusinessSubscriptionEvent;
@@ -59,65 +42,16 @@ import com.ning.billing.catalog.api.Product;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.mock.MockPlan;
-import com.ning.billing.util.cache.CacheControllerDispatcher;
-import com.ning.billing.util.callcontext.InternalCallContextFactory;
-import com.ning.billing.util.callcontext.TenantContext;
-import com.ning.billing.util.clock.Clock;
-import com.ning.billing.util.clock.ClockMock;
-import com.ning.billing.util.dao.DefaultNonEntityDao;
-import com.ning.billing.util.dao.NonEntityDao;
-import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
-import com.ning.billing.util.svcapi.payment.PaymentInternalApi;
-import com.ning.billing.util.svcapi.tag.TagInternalApi;
 
 public class TestDefaultAnalyticsUserApi extends AnalyticsTestSuiteWithEmbeddedDB {
 
-    private final Clock clock = new ClockMock();
-    private final TenantContext tenantContext = Mockito.mock(TenantContext.class);
-
-    private AnalyticsUserApi analyticsUserApi;
-    private BusinessAccountSqlDao accountSqlDao;
-    private BusinessSubscriptionTransitionSqlDao subscriptionTransitionSqlDao;
-    private BusinessInvoiceSqlDao invoiceSqlDao;
-    private BusinessInvoiceItemSqlDao invoiceItemSqlDao;
-    private BusinessAccountTagSqlDao accountTagSqlDao;
-    private BusinessOverdueStatusSqlDao overdueStatusSqlDao;
-    private BusinessInvoicePaymentSqlDao invoicePaymentSqlDao;
-
-    @BeforeMethod(groups = "mysql")
-    public void setUp() throws Exception {
-        final IDBI dbi = helper.getDBI();
-        final NonEntityDao nonEntityDao = new DefaultNonEntityDao(dbi);
-        accountSqlDao = dbi.onDemand(BusinessAccountSqlDao.class);
-        subscriptionTransitionSqlDao = dbi.onDemand(BusinessSubscriptionTransitionSqlDao.class);
-        invoiceSqlDao = dbi.onDemand(BusinessInvoiceSqlDao.class);
-        invoiceItemSqlDao = dbi.onDemand(BusinessInvoiceItemSqlDao.class);
-        accountTagSqlDao = dbi.onDemand(BusinessAccountTagSqlDao.class);
-        overdueStatusSqlDao = dbi.onDemand(BusinessOverdueStatusSqlDao.class);
-        invoicePaymentSqlDao = dbi.onDemand(BusinessInvoicePaymentSqlDao.class);
-
-        final AnalyticsDao analyticsDao = new DefaultAnalyticsDao(accountSqlDao, subscriptionTransitionSqlDao, invoiceSqlDao,
-                                                                  invoiceItemSqlDao, accountTagSqlDao, overdueStatusSqlDao, invoicePaymentSqlDao);
-        analyticsUserApi = new DefaultAnalyticsUserApi(analyticsDao,
-                                                       Mockito.mock(BusinessSubscriptionTransitionDao.class),
-                                                       Mockito.mock(BusinessAccountDao.class),
-                                                       Mockito.mock(BusinessInvoiceDao.class),
-                                                       Mockito.mock(BusinessOverdueStatusDao.class),
-                                                       Mockito.mock(BusinessInvoicePaymentDao.class),
-                                                       Mockito.mock(BusinessTagDao.class),
-                                                       Mockito.mock(EntitlementInternalApi.class),
-                                                       Mockito.mock(PaymentInternalApi.class),
-                                                       Mockito.mock(TagInternalApi.class),
-                                                       new InternalCallContextFactory(clock, nonEntityDao, new CacheControllerDispatcher()));
-    }
-
     @Test(groups = "mysql")
     public void testAccountsCreatedOverTime() throws Exception {
         final BusinessAccountModelDao account = new BusinessAccountModelDao(UUID.randomUUID(), UUID.randomUUID().toString(), UUID.randomUUID().toString(), BigDecimal.ONE, clock.getUTCToday(),
                                                                             BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "FRANCE", "USD", clock.getUTCNow(), clock.getUTCNow());
         accountSqlDao.createAccount(account, internalCallContext);
 
-        final TimeSeriesData data = analyticsUserApi.getAccountsCreatedOverTime(tenantContext);
+        final TimeSeriesData data = analyticsUserApi.getAccountsCreatedOverTime(callContext);
         Assert.assertEquals(data.getDates().size(), 1);
         Assert.assertEquals(data.getDates().get(0), clock.getUTCToday());
         Assert.assertEquals(data.getValues().size(), 1);
@@ -147,11 +81,11 @@ public class TestDefaultAnalyticsUserApi extends AnalyticsTestSuiteWithEmbeddedD
         );
         subscriptionTransitionSqlDao.createTransition(transition, internalCallContext);
 
-        final TimeSeriesData notFoundData = analyticsUserApi.getSubscriptionsCreatedOverTime(productType, UUID.randomUUID().toString(), tenantContext);
+        final TimeSeriesData notFoundData = analyticsUserApi.getSubscriptionsCreatedOverTime(productType, UUID.randomUUID().toString(), callContext);
         Assert.assertEquals(notFoundData.getDates().size(), 0);
         Assert.assertEquals(notFoundData.getValues().size(), 0);
 
-        final TimeSeriesData data = analyticsUserApi.getSubscriptionsCreatedOverTime(productType, phase.getName(), tenantContext);
+        final TimeSeriesData data = analyticsUserApi.getSubscriptionsCreatedOverTime(productType, phase.getName(), callContext);
         Assert.assertEquals(data.getDates().size(), 1);
         Assert.assertEquals(data.getDates().get(0), clock.getUTCToday());
         Assert.assertEquals(data.getValues().size(), 1);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java
index d26faf9..58e6d46 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java
@@ -24,7 +24,6 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 import org.mockito.Mockito;
-import org.skife.jdbi.v2.IDBI;
 import org.testng.Assert;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
@@ -40,7 +39,6 @@ import com.ning.billing.analytics.model.BusinessSubscriptionTransitionModelDao;
 import com.ning.billing.analytics.utils.Rounder;
 import com.ning.billing.catalog.api.Catalog;
 import com.ning.billing.catalog.api.CatalogApiException;
-import com.ning.billing.catalog.api.CatalogService;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.Plan;
@@ -49,8 +47,6 @@ import com.ning.billing.catalog.api.Product;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.mock.MockPlan;
-import com.ning.billing.util.clock.Clock;
-import com.ning.billing.util.clock.DefaultClock;
 
 public class TestAnalyticsDao extends AnalyticsTestSuiteWithEmbeddedDB {
 
@@ -61,21 +57,17 @@ public class TestAnalyticsDao extends AnalyticsTestSuiteWithEmbeddedDB {
     private static final String ACCOUNT_KEY = "pierre-143343-vcc";
     private static final String CURRENCY = UUID.randomUUID().toString();
 
-    private final Clock clock = new DefaultClock();
     private final Product product = new MockProduct("platinium", "subscription", ProductCategory.BASE);
     private final Plan plan = new MockPlan("platinum-monthly", product);
     private final PlanPhase phase = new MockPhase(PhaseType.EVERGREEN, plan, MockDuration.UNLIMITED(), 25.95);
 
-    private BusinessSubscriptionTransitionSqlDao businessSubscriptionTransitionSqlDao;
     private BusinessSubscriptionTransitionModelDao transition;
-    private BusinessAccountSqlDao businessAccountSqlDao;
     private BusinessAccountModelDao account;
 
-    private final CatalogService catalogService = Mockito.mock(CatalogService.class);
     private final Catalog catalog = Mockito.mock(Catalog.class);
 
     @BeforeClass(groups = "slow")
-    public void setup() throws IOException, ClassNotFoundException, SQLException, CatalogApiException {
+    public void setupMocks() throws IOException, ClassNotFoundException, SQLException, CatalogApiException {
         Mockito.when(catalog.findPlan(Mockito.anyString(), Mockito.<DateTime>any())).thenReturn(plan);
         Mockito.when(catalog.findPlan(Mockito.anyString(), Mockito.<DateTime>any(), Mockito.<DateTime>any())).thenReturn(plan);
         Mockito.when(catalog.findPhase(Mockito.anyString(), Mockito.<DateTime>any(), Mockito.<DateTime>any())).thenReturn(phase);
@@ -93,31 +85,11 @@ public class TestAnalyticsDao extends AnalyticsTestSuiteWithEmbeddedDB {
 
         transition = new BusinessSubscriptionTransitionModelDao(TOTAL_ORDERING, BUNDLE_ID, EXTERNAL_KEY, ACCOUNT_ID, ACCOUNT_KEY,
                                                                 UUID.randomUUID(), requestedTimestamp, event, prevSubscription, nextSubscription);
-
-        final IDBI dbi = helper.getDBI();
-        businessSubscriptionTransitionSqlDao = dbi.onDemand(BusinessSubscriptionTransitionSqlDao.class);
-
-        // Healthcheck test to make sure MySQL is setup properly
-        try {
-            businessSubscriptionTransitionSqlDao.test(internalCallContext);
-        } catch (Throwable t) {
-            Assert.fail(t.toString());
-        }
     }
 
     private void setupBusinessAccount() {
         account = new BusinessAccountModelDao(UUID.randomUUID(), ACCOUNT_KEY, UUID.randomUUID().toString(), BigDecimal.ONE, clock.getUTCToday(),
                                               BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "FRANCE", CURRENCY, clock.getUTCNow(), clock.getUTCNow());
-
-        final IDBI dbi = helper.getDBI();
-        businessAccountSqlDao = dbi.onDemand(BusinessAccountSqlDao.class);
-
-        // Healthcheck test to make sure MySQL is setup properly
-        try {
-            businessAccountSqlDao.test(internalCallContext);
-        } catch (Throwable t) {
-            Assert.fail(t.toString());
-        }
     }
 
     @Test(groups = "slow")
@@ -134,9 +106,9 @@ public class TestAnalyticsDao extends AnalyticsTestSuiteWithEmbeddedDB {
                 null,
                 transition.getNextSubscription()
         );
-        businessSubscriptionTransitionSqlDao.createTransition(transitionWithNullPrev, internalCallContext);
+        subscriptionTransitionSqlDao.createTransition(transitionWithNullPrev, internalCallContext);
 
-        final List<BusinessSubscriptionTransitionModelDao> transitions = businessSubscriptionTransitionSqlDao.getTransitionsByKey(EXTERNAL_KEY, internalCallContext);
+        final List<BusinessSubscriptionTransitionModelDao> transitions = subscriptionTransitionSqlDao.getTransitionsByKey(EXTERNAL_KEY, internalCallContext);
         Assert.assertEquals(transitions.size(), 1);
         Assert.assertEquals(transitions.get(0), transitionWithNullPrev);
     }
@@ -155,9 +127,9 @@ public class TestAnalyticsDao extends AnalyticsTestSuiteWithEmbeddedDB {
                 transition.getPreviousSubscription(),
                 null
         );
-        businessSubscriptionTransitionSqlDao.createTransition(transitionWithNullNext, internalCallContext);
+        subscriptionTransitionSqlDao.createTransition(transitionWithNullNext, internalCallContext);
 
-        final List<BusinessSubscriptionTransitionModelDao> transitions = businessSubscriptionTransitionSqlDao.getTransitionsByKey(EXTERNAL_KEY, internalCallContext);
+        final List<BusinessSubscriptionTransitionModelDao> transitions = subscriptionTransitionSqlDao.getTransitionsByKey(EXTERNAL_KEY, internalCallContext);
         Assert.assertEquals(transitions.size(), 1);
         Assert.assertEquals(transitions.get(0), transitionWithNullNext);
     }
@@ -177,9 +149,9 @@ public class TestAnalyticsDao extends AnalyticsTestSuiteWithEmbeddedDB {
                 subscriptionWithNullFields,
                 subscriptionWithNullFields
         );
-        businessSubscriptionTransitionSqlDao.createTransition(transitionWithNullFields, internalCallContext);
+        subscriptionTransitionSqlDao.createTransition(transitionWithNullFields, internalCallContext);
 
-        final List<BusinessSubscriptionTransitionModelDao> transitions = businessSubscriptionTransitionSqlDao.getTransitionsByKey(EXTERNAL_KEY, internalCallContext);
+        final List<BusinessSubscriptionTransitionModelDao> transitions = subscriptionTransitionSqlDao.getTransitionsByKey(EXTERNAL_KEY, internalCallContext);
         Assert.assertEquals(transitions.size(), 1);
         Assert.assertEquals(transitions.get(0), transitionWithNullFields);
     }
@@ -199,9 +171,9 @@ public class TestAnalyticsDao extends AnalyticsTestSuiteWithEmbeddedDB {
                 subscriptionWithNullPlanAndPhase,
                 subscriptionWithNullPlanAndPhase
         );
-        businessSubscriptionTransitionSqlDao.createTransition(transitionWithNullPlanAndPhase, internalCallContext);
+        subscriptionTransitionSqlDao.createTransition(transitionWithNullPlanAndPhase, internalCallContext);
 
-        final List<BusinessSubscriptionTransitionModelDao> transitions = businessSubscriptionTransitionSqlDao.getTransitionsByKey(EXTERNAL_KEY, internalCallContext);
+        final List<BusinessSubscriptionTransitionModelDao> transitions = subscriptionTransitionSqlDao.getTransitionsByKey(EXTERNAL_KEY, internalCallContext);
         Assert.assertEquals(transitions.size(), 1);
         Assert.assertEquals(transitions.get(0).getExternalKey(), transition.getExternalKey());
         Assert.assertEquals(transitions.get(0).getRequestedTimestamp(), transition.getRequestedTimestamp());
@@ -225,9 +197,9 @@ public class TestAnalyticsDao extends AnalyticsTestSuiteWithEmbeddedDB {
                 subscriptionWithNullPlan,
                 subscriptionWithNullPlan
         );
-        businessSubscriptionTransitionSqlDao.createTransition(transitionWithNullPlan, internalCallContext);
+        subscriptionTransitionSqlDao.createTransition(transitionWithNullPlan, internalCallContext);
 
-        final List<BusinessSubscriptionTransitionModelDao> transitions = businessSubscriptionTransitionSqlDao.getTransitionsByKey(EXTERNAL_KEY, internalCallContext);
+        final List<BusinessSubscriptionTransitionModelDao> transitions = subscriptionTransitionSqlDao.getTransitionsByKey(EXTERNAL_KEY, internalCallContext);
         Assert.assertEquals(transitions.size(), 1);
         // Null Plan but Phase - we don't turn the subscription into a null
         Assert.assertEquals(transitions.get(0), transitionWithNullPlan);
@@ -248,9 +220,9 @@ public class TestAnalyticsDao extends AnalyticsTestSuiteWithEmbeddedDB {
                 subscriptionWithNullPhase,
                 subscriptionWithNullPhase
         );
-        businessSubscriptionTransitionSqlDao.createTransition(transitionWithNullPhase, internalCallContext);
+        subscriptionTransitionSqlDao.createTransition(transitionWithNullPhase, internalCallContext);
 
-        final List<BusinessSubscriptionTransitionModelDao> transitions = businessSubscriptionTransitionSqlDao.getTransitionsByKey(EXTERNAL_KEY, internalCallContext);
+        final List<BusinessSubscriptionTransitionModelDao> transitions = subscriptionTransitionSqlDao.getTransitionsByKey(EXTERNAL_KEY, internalCallContext);
         Assert.assertEquals(transitions.size(), 1);
         Assert.assertEquals(transitions.get(0).getExternalKey(), transition.getExternalKey());
         Assert.assertEquals(transitions.get(0).getRequestedTimestamp(), transition.getRequestedTimestamp());
@@ -264,20 +236,20 @@ public class TestAnalyticsDao extends AnalyticsTestSuiteWithEmbeddedDB {
 
     @Test(groups = "slow")
     public void testCreateAndRetrieveTransitions() {
-        businessSubscriptionTransitionSqlDao.createTransition(transition, internalCallContext);
+        subscriptionTransitionSqlDao.createTransition(transition, internalCallContext);
 
-        final List<BusinessSubscriptionTransitionModelDao> transitions = businessSubscriptionTransitionSqlDao.getTransitionsByKey(EXTERNAL_KEY, internalCallContext);
+        final List<BusinessSubscriptionTransitionModelDao> transitions = subscriptionTransitionSqlDao.getTransitionsByKey(EXTERNAL_KEY, internalCallContext);
         Assert.assertEquals(transitions.size(), 1);
         Assert.assertEquals(transitions.get(0), transition);
 
-        Assert.assertEquals(businessSubscriptionTransitionSqlDao.getTransitionsByKey("Doesn't exist", internalCallContext).size(), 0);
+        Assert.assertEquals(subscriptionTransitionSqlDao.getTransitionsByKey("Doesn't exist", internalCallContext).size(), 0);
     }
 
     @Test(groups = "slow")
     public void testCreateSaveAndRetrieveAccounts() {
         // Create and retrieve an account
-        businessAccountSqlDao.createAccount(account, internalCallContext);
-        final BusinessAccountModelDao foundAccount = businessAccountSqlDao.getAccountByKey(ACCOUNT_KEY, internalCallContext);
+        accountSqlDao.createAccount(account, internalCallContext);
+        final BusinessAccountModelDao foundAccount = accountSqlDao.getAccountByKey(ACCOUNT_KEY, internalCallContext);
         Assert.assertEquals(foundAccount.getCreatedDate().getMillis(), account.getCreatedDate().getMillis());
         Assert.assertEquals(foundAccount.getUpdatedDate().getMillis(), account.getUpdatedDate().getMillis());
         Assert.assertTrue(foundAccount.equals(account));
@@ -286,14 +258,14 @@ public class TestAnalyticsDao extends AnalyticsTestSuiteWithEmbeddedDB {
         account.setBalance(BigDecimal.TEN);
         account.setPaymentMethod("PayPal");
         account.setCurrency("CAD");
-        businessAccountSqlDao.saveAccount(account, internalCallContext);
+        accountSqlDao.saveAccount(account, internalCallContext);
         // Verify the save worked as expected
-        account = businessAccountSqlDao.getAccountByKey(ACCOUNT_KEY, internalCallContext);
+        account = accountSqlDao.getAccountByKey(ACCOUNT_KEY, internalCallContext);
         Assert.assertEquals(Rounder.round(BigDecimal.TEN), account.getRoundedBalance());
         Assert.assertEquals("PayPal", account.getPaymentMethod());
         Assert.assertEquals("CAD", account.getCurrency());
 
         // ACCOUNT not found
-        Assert.assertNull(businessAccountSqlDao.getAccountByKey("Doesn't exist", internalCallContext));
+        Assert.assertNull(accountSqlDao.getAccountByKey("Doesn't exist", internalCallContext));
     }
 }
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessAccountFieldSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessAccountFieldSqlDao.java
index 59228ab..ca69f76 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessAccountFieldSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessAccountFieldSqlDao.java
@@ -19,9 +19,7 @@ package com.ning.billing.analytics.dao;
 import java.util.List;
 import java.util.UUID;
 
-import org.skife.jdbi.v2.IDBI;
 import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.ning.billing.analytics.AnalyticsTestSuiteWithEmbeddedDB;
@@ -29,14 +27,6 @@ import com.ning.billing.analytics.model.BusinessAccountFieldModelDao;
 
 public class TestBusinessAccountFieldSqlDao extends AnalyticsTestSuiteWithEmbeddedDB {
 
-    private BusinessAccountFieldSqlDao accountFieldSqlDao;
-
-    @BeforeMethod(groups = "slow")
-    public void setUp() throws Exception {
-        final IDBI dbi = helper.getDBI();
-        accountFieldSqlDao = dbi.onDemand(BusinessAccountFieldSqlDao.class);
-    }
-
     @Test(groups = "slow")
     public void testCRUD() throws Exception {
         final UUID accountId = UUID.randomUUID();
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessAccountTagSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessAccountTagSqlDao.java
index 183b2f1..fe3d38d 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessAccountTagSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessAccountTagSqlDao.java
@@ -19,9 +19,7 @@ package com.ning.billing.analytics.dao;
 import java.util.List;
 import java.util.UUID;
 
-import org.skife.jdbi.v2.IDBI;
 import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.ning.billing.analytics.AnalyticsTestSuiteWithEmbeddedDB;
@@ -29,14 +27,6 @@ import com.ning.billing.analytics.model.BusinessAccountTagModelDao;
 
 public class TestBusinessAccountTagSqlDao extends AnalyticsTestSuiteWithEmbeddedDB {
 
-    private BusinessAccountTagSqlDao accountTagSqlDao;
-
-    @BeforeMethod(groups = "slow")
-    public void setUp() throws Exception {
-        final IDBI dbi = helper.getDBI();
-        accountTagSqlDao = dbi.onDemand(BusinessAccountTagSqlDao.class);
-    }
-
     @Test(groups = "slow")
     public void testCRUD() throws Exception {
         final UUID accountId = UUID.randomUUID();
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceFieldSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceFieldSqlDao.java
index 84521f6..976d056 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceFieldSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceFieldSqlDao.java
@@ -19,9 +19,7 @@ package com.ning.billing.analytics.dao;
 import java.util.List;
 import java.util.UUID;
 
-import org.skife.jdbi.v2.IDBI;
 import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.ning.billing.analytics.AnalyticsTestSuiteWithEmbeddedDB;
@@ -29,14 +27,6 @@ import com.ning.billing.analytics.model.BusinessInvoiceFieldModelDao;
 
 public class TestBusinessInvoiceFieldSqlDao extends AnalyticsTestSuiteWithEmbeddedDB {
 
-    private BusinessInvoiceFieldSqlDao invoiceFieldSqlDao;
-
-    @BeforeMethod(groups = "slow")
-    public void setUp() throws Exception {
-        final IDBI dbi = helper.getDBI();
-        invoiceFieldSqlDao = dbi.onDemand(BusinessInvoiceFieldSqlDao.class);
-    }
-
     @Test(groups = "slow")
     public void testCRUD() throws Exception {
         final String invoiceId = UUID.randomUUID().toString();
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceItemSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceItemSqlDao.java
index 86c8e40..5d0329b 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceItemSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceItemSqlDao.java
@@ -21,29 +21,15 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 import org.joda.time.LocalDate;
-import org.skife.jdbi.v2.IDBI;
 import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.ning.billing.analytics.AnalyticsTestSuiteWithEmbeddedDB;
 import com.ning.billing.analytics.model.BusinessInvoiceItemModelDao;
 import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.util.clock.Clock;
-import com.ning.billing.util.clock.DefaultClock;
 
 public class TestBusinessInvoiceItemSqlDao extends AnalyticsTestSuiteWithEmbeddedDB {
 
-    private final Clock clock = new DefaultClock();
-
-    private BusinessInvoiceItemSqlDao invoiceItemSqlDao;
-
-    @BeforeMethod(groups = "slow")
-    public void setUp() throws Exception {
-        final IDBI dbi = helper.getDBI();
-        invoiceItemSqlDao = dbi.onDemand(BusinessInvoiceItemSqlDao.class);
-    }
-
     @Test(groups = "slow")
     public void testCRUD() throws Exception {
         final UUID invoiceId = UUID.randomUUID();
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoicePaymentFieldSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoicePaymentFieldSqlDao.java
index 2fb2c6d..2569f3d 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoicePaymentFieldSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoicePaymentFieldSqlDao.java
@@ -19,9 +19,7 @@ package com.ning.billing.analytics.dao;
 import java.util.List;
 import java.util.UUID;
 
-import org.skife.jdbi.v2.IDBI;
 import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.ning.billing.analytics.AnalyticsTestSuiteWithEmbeddedDB;
@@ -29,14 +27,6 @@ import com.ning.billing.analytics.model.BusinessInvoicePaymentFieldModelDao;
 
 public class TestBusinessInvoicePaymentFieldSqlDao extends AnalyticsTestSuiteWithEmbeddedDB {
 
-    private BusinessInvoicePaymentFieldSqlDao invoicePaymentFieldSqlDao;
-
-    @BeforeMethod(groups = "slow")
-    public void setUp() throws Exception {
-        final IDBI dbi = helper.getDBI();
-        invoicePaymentFieldSqlDao = dbi.onDemand(BusinessInvoicePaymentFieldSqlDao.class);
-    }
-
     @Test(groups = "slow")
     public void testCRUD() throws Exception {
         final String paymentId = UUID.randomUUID().toString();
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoicePaymentSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoicePaymentSqlDao.java
index 3811465..7e76cf9 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoicePaymentSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoicePaymentSqlDao.java
@@ -21,9 +21,7 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
-import org.skife.jdbi.v2.IDBI;
 import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.ning.billing.analytics.AnalyticsTestSuiteWithEmbeddedDB;
@@ -32,14 +30,6 @@ import com.ning.billing.catalog.api.Currency;
 
 public class TestBusinessInvoicePaymentSqlDao extends AnalyticsTestSuiteWithEmbeddedDB {
 
-    private BusinessInvoicePaymentSqlDao invoicePaymentSqlDao;
-
-    @BeforeMethod(groups = "slow")
-    public void setUp() throws Exception {
-        final IDBI dbi = helper.getDBI();
-        invoicePaymentSqlDao = dbi.onDemand(BusinessInvoicePaymentSqlDao.class);
-    }
-
     @Test(groups = "slow")
     public void testCRUD() throws Exception {
         final String extFirstPaymentRefId = UUID.randomUUID().toString();
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoicePaymentTagSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoicePaymentTagSqlDao.java
index 1b63714..d96103f 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoicePaymentTagSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoicePaymentTagSqlDao.java
@@ -19,9 +19,7 @@ package com.ning.billing.analytics.dao;
 import java.util.List;
 import java.util.UUID;
 
-import org.skife.jdbi.v2.IDBI;
 import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.ning.billing.analytics.AnalyticsTestSuiteWithEmbeddedDB;
@@ -29,14 +27,6 @@ import com.ning.billing.analytics.model.BusinessInvoicePaymentTagModelDao;
 
 public class TestBusinessInvoicePaymentTagSqlDao extends AnalyticsTestSuiteWithEmbeddedDB {
 
-    private BusinessInvoicePaymentTagSqlDao invoicePaymentTagSqlDao;
-
-    @BeforeMethod(groups = "slow")
-    public void setUp() throws Exception {
-        final IDBI dbi = helper.getDBI();
-        invoicePaymentTagSqlDao = dbi.onDemand(BusinessInvoicePaymentTagSqlDao.class);
-    }
-
     @Test(groups = "slow")
     public void testCRUD() throws Exception {
         final String paymentId = UUID.randomUUID().toString();
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceSqlDao.java
index 7b54ead..1084a83 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceSqlDao.java
@@ -21,29 +21,15 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 import org.joda.time.LocalDate;
-import org.skife.jdbi.v2.IDBI;
 import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.ning.billing.analytics.AnalyticsTestSuiteWithEmbeddedDB;
 import com.ning.billing.analytics.model.BusinessInvoiceModelDao;
 import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.util.clock.Clock;
-import com.ning.billing.util.clock.DefaultClock;
 
 public class TestBusinessInvoiceSqlDao extends AnalyticsTestSuiteWithEmbeddedDB {
 
-    private final Clock clock = new DefaultClock();
-
-    private BusinessInvoiceSqlDao invoiceSqlDao;
-
-    @BeforeMethod(groups = "slow")
-    public void setUp() throws Exception {
-        final IDBI dbi = helper.getDBI();
-        invoiceSqlDao = dbi.onDemand(BusinessInvoiceSqlDao.class);
-    }
-
     @Test(groups = "slow")
     public void testCRUD() throws Exception {
         final UUID invoiceId = UUID.randomUUID();
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceTagSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceTagSqlDao.java
index 938e32e..eb53bc0 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceTagSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoiceTagSqlDao.java
@@ -19,9 +19,7 @@ package com.ning.billing.analytics.dao;
 import java.util.List;
 import java.util.UUID;
 
-import org.skife.jdbi.v2.IDBI;
 import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.ning.billing.analytics.AnalyticsTestSuiteWithEmbeddedDB;
@@ -29,14 +27,6 @@ import com.ning.billing.analytics.model.BusinessInvoiceTagModelDao;
 
 public class TestBusinessInvoiceTagSqlDao extends AnalyticsTestSuiteWithEmbeddedDB {
 
-    private BusinessInvoiceTagSqlDao invoiceTagSqlDao;
-
-    @BeforeMethod(groups = "slow")
-    public void setUp() throws Exception {
-        final IDBI dbi = helper.getDBI();
-        invoiceTagSqlDao = dbi.onDemand(BusinessInvoiceTagSqlDao.class);
-    }
-
     @Test(groups = "slow")
     public void testCRUD() throws Exception {
         final String invoiceId = UUID.randomUUID().toString();
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessOverdueStatusSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessOverdueStatusSqlDao.java
index 6faad86..57ee193 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessOverdueStatusSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessOverdueStatusSqlDao.java
@@ -20,9 +20,7 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
-import org.skife.jdbi.v2.IDBI;
 import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.ning.billing.analytics.AnalyticsTestSuiteWithEmbeddedDB;
@@ -30,14 +28,6 @@ import com.ning.billing.analytics.model.BusinessOverdueStatusModelDao;
 
 public class TestBusinessOverdueStatusSqlDao extends AnalyticsTestSuiteWithEmbeddedDB {
 
-    private BusinessOverdueStatusSqlDao overdueStatusSqlDao;
-
-    @BeforeMethod(groups = "slow")
-    public void setUp() throws Exception {
-        final IDBI dbi = helper.getDBI();
-        overdueStatusSqlDao = dbi.onDemand(BusinessOverdueStatusSqlDao.class);
-    }
-
     @Test(groups = "slow")
     public void testCreate() throws Exception {
         final String accountKey = UUID.randomUUID().toString();
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessSubscriptionTransitionFieldSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessSubscriptionTransitionFieldSqlDao.java
index ba1fc93..8e4a09f 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessSubscriptionTransitionFieldSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessSubscriptionTransitionFieldSqlDao.java
@@ -19,9 +19,7 @@ package com.ning.billing.analytics.dao;
 import java.util.List;
 import java.util.UUID;
 
-import org.skife.jdbi.v2.IDBI;
 import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.ning.billing.analytics.AnalyticsTestSuiteWithEmbeddedDB;
@@ -29,14 +27,6 @@ import com.ning.billing.analytics.model.BusinessSubscriptionTransitionFieldModel
 
 public class TestBusinessSubscriptionTransitionFieldSqlDao extends AnalyticsTestSuiteWithEmbeddedDB {
 
-    private BusinessSubscriptionTransitionFieldSqlDao subscriptionTransitionFieldSqlDao;
-
-    @BeforeMethod(groups = "slow")
-    public void setUp() throws Exception {
-        final IDBI dbi = helper.getDBI();
-        subscriptionTransitionFieldSqlDao = dbi.onDemand(BusinessSubscriptionTransitionFieldSqlDao.class);
-    }
-
     @Test(groups = "slow")
     public void testCRUD() throws Exception {
         final String accountKey = UUID.randomUUID().toString();
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessSubscriptionTransitionTagSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessSubscriptionTransitionTagSqlDao.java
index 627de79..9e6c9e7 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessSubscriptionTransitionTagSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessSubscriptionTransitionTagSqlDao.java
@@ -19,9 +19,7 @@ package com.ning.billing.analytics.dao;
 import java.util.List;
 import java.util.UUID;
 
-import org.skife.jdbi.v2.IDBI;
 import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.ning.billing.analytics.AnalyticsTestSuiteWithEmbeddedDB;
@@ -29,14 +27,6 @@ import com.ning.billing.analytics.model.BusinessSubscriptionTransitionTagModelDa
 
 public class TestBusinessSubscriptionTransitionTagSqlDao extends AnalyticsTestSuiteWithEmbeddedDB {
 
-    private BusinessSubscriptionTransitionTagSqlDao subscriptionTransitionTagSqlDao;
-
-    @BeforeMethod(groups = "slow")
-    public void setUp() throws Exception {
-        final IDBI dbi = helper.getDBI();
-        subscriptionTransitionTagSqlDao = dbi.onDemand(BusinessSubscriptionTransitionTagSqlDao.class);
-    }
-
     @Test(groups = "slow")
     public void testCRUD() throws Exception {
         final String accountKey = UUID.randomUUID().toString();
diff --git a/analytics/src/test/java/com/ning/billing/analytics/glue/TestAnalyticsModule.java b/analytics/src/test/java/com/ning/billing/analytics/glue/TestAnalyticsModule.java
new file mode 100644
index 0000000..5956954
--- /dev/null
+++ b/analytics/src/test/java/com/ning/billing/analytics/glue/TestAnalyticsModule.java
@@ -0,0 +1,80 @@
+/*
+ * 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.analytics.glue;
+
+import java.util.Properties;
+
+import org.mockito.Mockito;
+import org.skife.config.ConfigSource;
+import org.skife.config.SimplePropertyConfigSource;
+
+import com.ning.billing.analytics.setup.AnalyticsModule;
+import com.ning.billing.catalog.MockCatalogModule;
+import com.ning.billing.invoice.dao.InvoiceDao;
+import com.ning.billing.mock.glue.MockAccountModule;
+import com.ning.billing.mock.glue.MockEntitlementModule;
+import com.ning.billing.mock.glue.MockGlobalLockerModule;
+import com.ning.billing.mock.glue.MockInvoiceModule;
+import com.ning.billing.mock.glue.MockJunctionModule;
+import com.ning.billing.mock.glue.MockOverdueModule;
+import com.ning.billing.mock.glue.MockPaymentModule;
+import com.ning.billing.payment.dao.PaymentDao;
+import com.ning.billing.util.glue.AuditModule;
+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.NotificationQueueModule;
+import com.ning.billing.util.glue.TagStoreModule;
+
+public class TestAnalyticsModule extends AnalyticsModule {
+
+    protected final ConfigSource configSource;
+
+    public TestAnalyticsModule() {
+        final Properties properties = new Properties(System.getProperties());
+        // Speed up the bus
+        properties.put("killbill.billing.util.persistent.bus.sleep", "10");
+        properties.put("killbill.billing.util.persistent.bus.nbThreads", "1");
+        configSource = new SimplePropertyConfigSource(properties);
+
+        // Ignore ehcache checks. Unfortunately, ehcache looks at system properties directly...
+        System.setProperty("net.sf.ehcache.skipUpdateCheck", "true");
+    }
+
+    @Override
+    protected void configure() {
+        super.configure();
+
+        install(new AuditModule());
+        install(new CacheModule());
+        install(new CallContextModule());
+        install(new CustomFieldModule());
+        install(new MockAccountModule());
+        install(new MockCatalogModule());
+        install(new MockEntitlementModule());
+        install(new MockInvoiceModule());
+        install(new MockJunctionModule());
+        install(new MockOverdueModule());
+        install(new MockPaymentModule());
+        install(new MockGlobalLockerModule());
+        install(new NotificationQueueModule());
+        install(new TagStoreModule());
+
+        bind(InvoiceDao.class).toInstance(Mockito.mock(InvoiceDao.class));
+        bind(PaymentDao.class).toInstance(Mockito.mock(PaymentDao.class));
+    }
+}
diff --git a/analytics/src/test/java/com/ning/billing/analytics/glue/TestAnalyticsModuleNoDB.java b/analytics/src/test/java/com/ning/billing/analytics/glue/TestAnalyticsModuleNoDB.java
new file mode 100644
index 0000000..55f675e
--- /dev/null
+++ b/analytics/src/test/java/com/ning/billing/analytics/glue/TestAnalyticsModuleNoDB.java
@@ -0,0 +1,69 @@
+/*
+ * 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.analytics.glue;
+
+import org.mockito.Mockito;
+
+import com.ning.billing.GuicyKillbillTestNoDBModule;
+import com.ning.billing.analytics.MockBusinessSubscriptionTransitionSqlDao;
+import com.ning.billing.analytics.dao.BusinessAccountFieldSqlDao;
+import com.ning.billing.analytics.dao.BusinessAccountSqlDao;
+import com.ning.billing.analytics.dao.BusinessAccountTagSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoiceFieldSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoiceItemSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoicePaymentFieldSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoicePaymentSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoicePaymentTagSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoiceSqlDao;
+import com.ning.billing.analytics.dao.BusinessInvoiceTagSqlDao;
+import com.ning.billing.analytics.dao.BusinessOverdueStatusSqlDao;
+import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionFieldSqlDao;
+import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionSqlDao;
+import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionTagSqlDao;
+import com.ning.billing.mock.glue.MockNonEntityDaoModule;
+import com.ning.billing.util.bus.InMemoryBusModule;
+
+public class TestAnalyticsModuleNoDB extends TestAnalyticsModule {
+
+    @Override
+    protected void installAnalyticsSqlDao() {
+        bind(BusinessSubscriptionTransitionSqlDao.class).to(MockBusinessSubscriptionTransitionSqlDao.class).asEagerSingleton();
+
+        bind(BusinessAccountSqlDao.class).toInstance(Mockito.mock(BusinessAccountSqlDao.class));
+        bind(BusinessAccountTagSqlDao.class).toInstance(Mockito.mock(BusinessAccountTagSqlDao.class));
+        bind(BusinessAccountFieldSqlDao.class).toInstance(Mockito.mock(BusinessAccountFieldSqlDao.class));
+        bind(BusinessInvoiceFieldSqlDao.class).toInstance(Mockito.mock(BusinessInvoiceFieldSqlDao.class));
+        bind(BusinessInvoiceItemSqlDao.class).toInstance(Mockito.mock(BusinessInvoiceItemSqlDao.class));
+        bind(BusinessInvoicePaymentFieldSqlDao.class).toInstance(Mockito.mock(BusinessInvoicePaymentFieldSqlDao.class));
+        bind(BusinessInvoicePaymentSqlDao.class).toInstance(Mockito.mock(BusinessInvoicePaymentSqlDao.class));
+        bind(BusinessInvoicePaymentTagSqlDao.class).toInstance(Mockito.mock(BusinessInvoicePaymentTagSqlDao.class));
+        bind(BusinessInvoiceSqlDao.class).toInstance(Mockito.mock(BusinessInvoiceSqlDao.class));
+        bind(BusinessInvoiceTagSqlDao.class).toInstance(Mockito.mock(BusinessInvoiceTagSqlDao.class));
+        bind(BusinessOverdueStatusSqlDao.class).toInstance(Mockito.mock(BusinessOverdueStatusSqlDao.class));
+        bind(BusinessSubscriptionTransitionFieldSqlDao.class).toInstance(Mockito.mock(BusinessSubscriptionTransitionFieldSqlDao.class));
+        bind(BusinessSubscriptionTransitionTagSqlDao.class).toInstance(Mockito.mock(BusinessSubscriptionTransitionTagSqlDao.class));
+    }
+
+    @Override
+    public void configure() {
+        super.configure();
+
+        install(new GuicyKillbillTestNoDBModule());
+        install(new MockNonEntityDaoModule());
+        install(new InMemoryBusModule(configSource));
+    }
+}
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccount.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccount.java
index 5634ca6..7ea70a2 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccount.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccount.java
@@ -25,13 +25,9 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.ning.billing.account.api.Account;
-import com.ning.billing.analytics.AnalyticsTestSuite;
-import com.ning.billing.util.clock.Clock;
-import com.ning.billing.util.clock.DefaultClock;
+import com.ning.billing.analytics.AnalyticsTestSuiteNoDB;
 
-public class TestBusinessAccount extends AnalyticsTestSuite {
-
-    private final Clock clock = new DefaultClock();
+public class TestBusinessAccount extends AnalyticsTestSuiteNoDB {
 
     private BusinessAccountModelDao account;
 
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccountField.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccountField.java
index 8ded19a..820f2c2 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccountField.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccountField.java
@@ -21,9 +21,9 @@ import java.util.UUID;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.ning.billing.analytics.AnalyticsTestSuite;
+import com.ning.billing.analytics.AnalyticsTestSuiteNoDB;
 
-public class TestBusinessAccountField extends AnalyticsTestSuite {
+public class TestBusinessAccountField extends AnalyticsTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testEquals() throws Exception {
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccountTag.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccountTag.java
index 7e84b39..752b4ad 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccountTag.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccountTag.java
@@ -21,9 +21,9 @@ import java.util.UUID;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.ning.billing.analytics.AnalyticsTestSuite;
+import com.ning.billing.analytics.AnalyticsTestSuiteNoDB;
 
-public class TestBusinessAccountTag extends AnalyticsTestSuite {
+public class TestBusinessAccountTag extends AnalyticsTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testEquals() throws Exception {
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoice.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoice.java
index d8c97c5..8bebd93 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoice.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoice.java
@@ -24,14 +24,10 @@ import org.joda.time.LocalDate;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.ning.billing.analytics.AnalyticsTestSuite;
+import com.ning.billing.analytics.AnalyticsTestSuiteNoDB;
 import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.util.clock.Clock;
-import com.ning.billing.util.clock.DefaultClock;
 
-public class TestBusinessInvoice extends AnalyticsTestSuite {
-
-    private final Clock clock = new DefaultClock();
+public class TestBusinessInvoice extends AnalyticsTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testEquals() throws Exception {
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoiceField.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoiceField.java
index ce444fa..9fbee64 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoiceField.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoiceField.java
@@ -21,9 +21,9 @@ import java.util.UUID;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.ning.billing.analytics.AnalyticsTestSuite;
+import com.ning.billing.analytics.AnalyticsTestSuiteNoDB;
 
-public class TestBusinessInvoiceField extends AnalyticsTestSuite {
+public class TestBusinessInvoiceField extends AnalyticsTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testEquals() throws Exception {
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoiceItem.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoiceItem.java
index a2f28f5..592ee3b 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoiceItem.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoiceItem.java
@@ -24,14 +24,10 @@ import org.joda.time.LocalDate;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.ning.billing.analytics.AnalyticsTestSuite;
+import com.ning.billing.analytics.AnalyticsTestSuiteNoDB;
 import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.util.clock.Clock;
-import com.ning.billing.util.clock.DefaultClock;
 
-public class TestBusinessInvoiceItem extends AnalyticsTestSuite {
-
-    private final Clock clock = new DefaultClock();
+public class TestBusinessInvoiceItem extends AnalyticsTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testEquals() throws Exception {
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoicePayment.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoicePayment.java
index 5292aac..116a2ad 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoicePayment.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoicePayment.java
@@ -24,10 +24,10 @@ import org.joda.time.DateTimeZone;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.ning.billing.analytics.AnalyticsTestSuite;
+import com.ning.billing.analytics.AnalyticsTestSuiteNoDB;
 import com.ning.billing.catalog.api.Currency;
 
-public class TestBusinessInvoicePayment extends AnalyticsTestSuite {
+public class TestBusinessInvoicePayment extends AnalyticsTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testEquals() throws Exception {
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoicePaymentField.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoicePaymentField.java
index d2b5d22..d94243f 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoicePaymentField.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoicePaymentField.java
@@ -21,9 +21,9 @@ import java.util.UUID;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.ning.billing.analytics.AnalyticsTestSuite;
+import com.ning.billing.analytics.AnalyticsTestSuiteNoDB;
 
-public class TestBusinessInvoicePaymentField extends AnalyticsTestSuite {
+public class TestBusinessInvoicePaymentField extends AnalyticsTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testEquals() throws Exception {
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoicePaymentTag.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoicePaymentTag.java
index 6d4f1f3..2a22d85 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoicePaymentTag.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoicePaymentTag.java
@@ -21,9 +21,9 @@ import java.util.UUID;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.ning.billing.analytics.AnalyticsTestSuite;
+import com.ning.billing.analytics.AnalyticsTestSuiteNoDB;
 
-public class TestBusinessInvoicePaymentTag extends AnalyticsTestSuite {
+public class TestBusinessInvoicePaymentTag extends AnalyticsTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testEquals() throws Exception {
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoiceTag.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoiceTag.java
index 38c882c..6c919f6 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoiceTag.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoiceTag.java
@@ -21,9 +21,9 @@ import java.util.UUID;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.ning.billing.analytics.AnalyticsTestSuite;
+import com.ning.billing.analytics.AnalyticsTestSuiteNoDB;
 
-public class TestBusinessInvoiceTag extends AnalyticsTestSuite {
+public class TestBusinessInvoiceTag extends AnalyticsTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testEquals() throws Exception {
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessOverdueStatus.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessOverdueStatus.java
index 8b30bbd..6078c72 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessOverdueStatus.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessOverdueStatus.java
@@ -23,9 +23,9 @@ import org.joda.time.DateTimeZone;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.ning.billing.analytics.AnalyticsTestSuite;
+import com.ning.billing.analytics.AnalyticsTestSuiteNoDB;
 
-public class TestBusinessOverdueStatus extends AnalyticsTestSuite {
+public class TestBusinessOverdueStatus extends AnalyticsTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testEquals() throws Exception {
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscription.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscription.java
index 5e7b918..14a4fc9 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscription.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscription.java
@@ -24,13 +24,12 @@ import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import com.ning.billing.analytics.AnalyticsTestSuite;
+import com.ning.billing.analytics.AnalyticsTestSuiteNoDB;
 import com.ning.billing.analytics.MockDuration;
 import com.ning.billing.analytics.MockPhase;
 import com.ning.billing.analytics.MockProduct;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.Catalog;
-import com.ning.billing.catalog.api.CatalogService;
 import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
@@ -42,7 +41,7 @@ import com.ning.billing.mock.MockSubscription;
 
 import static com.ning.billing.catalog.api.Currency.USD;
 
-public class TestBusinessSubscription extends AnalyticsTestSuite {
+public class TestBusinessSubscription extends AnalyticsTestSuiteNoDB {
 
     final Object[][] catalogMapping = {
             {BillingPeriod.NO_BILLING_PERIOD, 369.9500, 0.0000},
@@ -115,7 +114,6 @@ public class TestBusinessSubscription extends AnalyticsTestSuite {
     private Subscription isubscription;
     private BusinessSubscription subscription;
 
-    private final CatalogService catalogService = Mockito.mock(CatalogService.class);
     private final Catalog catalog = Mockito.mock(Catalog.class);
 
     @BeforeMethod(groups = "fast")
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionEvent.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionEvent.java
index 75c48ef..7b85925 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionEvent.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionEvent.java
@@ -22,12 +22,11 @@ import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import com.ning.billing.analytics.AnalyticsTestSuite;
+import com.ning.billing.analytics.AnalyticsTestSuiteNoDB;
 import com.ning.billing.analytics.MockDuration;
 import com.ning.billing.analytics.MockPhase;
 import com.ning.billing.analytics.MockProduct;
 import com.ning.billing.catalog.api.Catalog;
-import com.ning.billing.catalog.api.CatalogService;
 import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
@@ -37,14 +36,13 @@ import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.mock.MockPlan;
 import com.ning.billing.mock.MockSubscription;
 
-public class TestBusinessSubscriptionEvent extends AnalyticsTestSuite {
+public class TestBusinessSubscriptionEvent extends AnalyticsTestSuiteNoDB {
 
     private Product product;
     private Plan plan;
     private PlanPhase phase;
     private Subscription subscription;
 
-    private final CatalogService catalogService = Mockito.mock(CatalogService.class);
     private final Catalog catalog = Mockito.mock(Catalog.class);
 
     @BeforeMethod(groups = "fast")
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransition.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransition.java
index fc382a0..1440516 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransition.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransition.java
@@ -25,12 +25,11 @@ import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import com.ning.billing.analytics.AnalyticsTestSuite;
+import com.ning.billing.analytics.AnalyticsTestSuiteNoDB;
 import com.ning.billing.analytics.MockDuration;
 import com.ning.billing.analytics.MockPhase;
 import com.ning.billing.analytics.MockProduct;
 import com.ning.billing.catalog.api.Catalog;
-import com.ning.billing.catalog.api.CatalogService;
 import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
@@ -42,7 +41,7 @@ import com.ning.billing.mock.MockSubscription;
 
 import static com.ning.billing.catalog.api.Currency.USD;
 
-public class TestBusinessSubscriptionTransition extends AnalyticsTestSuite {
+public class TestBusinessSubscriptionTransition extends AnalyticsTestSuiteNoDB {
 
     private BusinessSubscription prevSubscription;
     private BusinessSubscription nextSubscription;
@@ -56,7 +55,6 @@ public class TestBusinessSubscriptionTransition extends AnalyticsTestSuite {
     private UUID subscriptionId;
     private BusinessSubscriptionTransitionModelDao transition;
 
-    private final CatalogService catalogService = Mockito.mock(CatalogService.class);
     private final Catalog catalog = Mockito.mock(Catalog.class);
 
     @BeforeMethod(alwaysRun = true)
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransitionField.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransitionField.java
index 5e32362..ab80b9b 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransitionField.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransitionField.java
@@ -21,9 +21,9 @@ import java.util.UUID;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.ning.billing.analytics.AnalyticsTestSuite;
+import com.ning.billing.analytics.AnalyticsTestSuiteNoDB;
 
-public class TestBusinessSubscriptionTransitionField extends AnalyticsTestSuite {
+public class TestBusinessSubscriptionTransitionField extends AnalyticsTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testEquals() throws Exception {
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransitionTag.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransitionTag.java
index 0a9e94e..fb4893c 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransitionTag.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransitionTag.java
@@ -21,9 +21,9 @@ import java.util.UUID;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.ning.billing.analytics.AnalyticsTestSuite;
+import com.ning.billing.analytics.AnalyticsTestSuiteNoDB;
 
-public class TestBusinessSubscriptionTransitionTag extends AnalyticsTestSuite {
+public class TestBusinessSubscriptionTransitionTag extends AnalyticsTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testEquals() throws Exception {
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessInvoiceRecorder.java b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessInvoiceRecorder.java
index 3b778df..4757505 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessInvoiceRecorder.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessInvoiceRecorder.java
@@ -24,30 +24,15 @@ import org.mockito.Mockito;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.ning.billing.analytics.dao.BusinessInvoiceSqlDao;
 import com.ning.billing.analytics.model.BusinessInvoiceItemModelDao;
-import com.ning.billing.catalog.MockCatalog;
-import com.ning.billing.catalog.MockCatalogService;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoiceItemType;
-import com.ning.billing.util.svcapi.account.AccountInternalApi;
-import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
-import com.ning.billing.util.svcapi.invoice.InvoiceInternalApi;
 
-public class TestBusinessInvoiceRecorder extends AnalyticsTestSuite {
-
-    private final AccountInternalApi accountApi = Mockito.mock(AccountInternalApi.class);
-    private final EntitlementInternalApi entitlementApi = Mockito.mock(EntitlementInternalApi.class);
-    private final InvoiceInternalApi invoiceApi = Mockito.mock(InvoiceInternalApi.class);
-    private final BusinessAccountDao bacDao = Mockito.mock(BusinessAccountDao.class);
-    private final BusinessInvoiceSqlDao sqlDao = Mockito.mock(BusinessInvoiceSqlDao.class);
+public class TestBusinessInvoiceRecorder extends AnalyticsTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testShouldBeAbleToHandleNullFieldsInInvoiceItem() throws Exception {
-        final BusinessInvoiceDao dao = new BusinessInvoiceDao(accountApi, entitlementApi, invoiceApi, bacDao,
-                                                              sqlDao, new MockCatalogService(new MockCatalog()));
-
         final InvoiceItem invoiceItem = Mockito.mock(InvoiceItem.class);
         Mockito.when(invoiceItem.getAmount()).thenReturn(BigDecimal.TEN);
         Mockito.when(invoiceItem.getCurrency()).thenReturn(Currency.AUD);
@@ -59,7 +44,7 @@ public class TestBusinessInvoiceRecorder extends AnalyticsTestSuite {
         Mockito.when(invoiceItem.getStartDate()).thenReturn(new LocalDate(1985, 9, 10));
         Mockito.when(invoiceItem.getInvoiceItemType()).thenReturn(InvoiceItemType.CREDIT_ADJ);
 
-        final BusinessInvoiceItemModelDao bii = dao.createBusinessInvoiceItem(invoiceItem, internalCallContext);
+        final BusinessInvoiceItemModelDao bii = invoiceDao.createBusinessInvoiceItem(invoiceItem, internalCallContext);
         Assert.assertNotNull(bii);
         Assert.assertEquals(bii.getAmount(), invoiceItem.getAmount());
         Assert.assertEquals(bii.getCurrency(), invoiceItem.getCurrency());
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java
index a58ccbf..313448f 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java
@@ -25,22 +25,17 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import com.ning.billing.account.api.Account;
-import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionSqlDao;
 import com.ning.billing.analytics.model.BusinessSubscriptionTransitionModelDao;
 import com.ning.billing.catalog.api.Catalog;
-import com.ning.billing.catalog.api.CatalogService;
 import com.ning.billing.entitlement.api.SubscriptionTransitionType;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.util.callcontext.InternalTenantContext;
-import com.ning.billing.util.clock.DefaultClock;
 import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
-import com.ning.billing.util.svcapi.account.AccountInternalApi;
-import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
 
 import com.google.common.collect.ImmutableList;
 
-public class TestBusinessSubscriptionTransitionRecorder extends AnalyticsTestSuite {
+public class TestBusinessSubscriptionTransitionRecorder extends AnalyticsTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testCreateAddOn() throws Exception {
@@ -50,25 +45,19 @@ public class TestBusinessSubscriptionTransitionRecorder extends AnalyticsTestSui
         final UUID subscriptionId = UUID.randomUUID();
 
         // Setup the catalog
-        final CatalogService catalogService = Mockito.mock(CatalogService.class);
         Mockito.when(catalogService.getFullCatalog()).thenReturn(Mockito.mock(Catalog.class));
 
-        // Setup the dao
-        final BusinessSubscriptionTransitionSqlDao sqlDao = new MockBusinessSubscriptionTransitionSqlDao();
-
         // Setup the entitlement API
         final SubscriptionBundle bundle = Mockito.mock(SubscriptionBundle.class);
         Mockito.when(bundle.getId()).thenReturn(bundleId);
         Mockito.when(bundle.getAccountId()).thenReturn(accountId);
         Mockito.when(bundle.getExternalKey()).thenReturn(externalKey.toString());
-        final EntitlementInternalApi entitlementApi = Mockito.mock(EntitlementInternalApi.class);
-        Mockito.when(entitlementApi.getBundleFromId(Mockito.<UUID>any(), Mockito.<InternalTenantContext>any())).thenReturn(bundle);
+        Mockito.when(entitlementInternalApi.getBundleFromId(Mockito.<UUID>any(), Mockito.<InternalTenantContext>any())).thenReturn(bundle);
 
         // Setup the account API
         final Account account = Mockito.mock(Account.class);
         Mockito.when(account.getExternalKey()).thenReturn(externalKey.toString());
-        final AccountInternalApi accountApi = Mockito.mock(AccountInternalApi.class);
-        Mockito.when(accountApi.getAccountById(Mockito.eq(bundle.getAccountId()), Mockito.<InternalTenantContext>any())).thenReturn(account);
+        Mockito.when(accountInternalApi.getAccountById(Mockito.eq(bundle.getAccountId()), Mockito.<InternalTenantContext>any())).thenReturn(account);
 
         // Create an new subscription event
         final EffectiveSubscriptionInternalEvent eventEffective = Mockito.mock(EffectiveSubscriptionInternalEvent.class);
@@ -82,15 +71,14 @@ public class TestBusinessSubscriptionTransitionRecorder extends AnalyticsTestSui
 
         final Subscription subscription = Mockito.mock(Subscription.class);
         Mockito.when(subscription.getId()).thenReturn(subscriptionId);
-        Mockito.when(entitlementApi.getAllTransitions(subscription, internalCallContext)).thenReturn(ImmutableList.<EffectiveSubscriptionInternalEvent>of(eventEffective));
+        Mockito.when(entitlementInternalApi.getAllTransitions(Mockito.eq(subscription), Mockito.<InternalTenantContext>any())).thenReturn(ImmutableList.<EffectiveSubscriptionInternalEvent>of(eventEffective));
 
-        Mockito.when(entitlementApi.getSubscriptionsForBundle(Mockito.<UUID>any(), Mockito.<InternalTenantContext>any())).thenReturn(ImmutableList.<Subscription>of(subscription));
+        Mockito.when(entitlementInternalApi.getSubscriptionsForBundle(Mockito.<UUID>any(), Mockito.<InternalTenantContext>any())).thenReturn(ImmutableList.<Subscription>of(subscription));
 
-        final BusinessSubscriptionTransitionDao dao = new BusinessSubscriptionTransitionDao(sqlDao, catalogService, entitlementApi, accountApi, new DefaultClock());
-        dao.rebuildTransitionsForBundle(bundle.getId(), internalCallContext);
+        subscriptionTransitionDao.rebuildTransitionsForBundle(bundle.getId(), internalCallContext);
 
-        Assert.assertEquals(sqlDao.getTransitionsByKey(externalKey.toString(), internalCallContext).size(), 1);
-        final BusinessSubscriptionTransitionModelDao transition = sqlDao.getTransitionsByKey(externalKey.toString(), internalCallContext).get(0);
+        Assert.assertEquals(subscriptionTransitionSqlDao.getTransitionsByKey(externalKey.toString(), internalCallContext).size(), 1);
+        final BusinessSubscriptionTransitionModelDao transition = subscriptionTransitionSqlDao.getTransitionsByKey(externalKey.toString(), internalCallContext).get(0);
         Assert.assertEquals(transition.getTotalOrdering(), (long) eventEffective.getTotalOrdering());
         Assert.assertEquals(transition.getAccountKey(), externalKey.toString());
         // Make sure all the prev_ columns are null
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessTagRecorder.java b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessTagRecorder.java
index e77fa7b..23e1b42 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessTagRecorder.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessTagRecorder.java
@@ -19,128 +19,30 @@ package com.ning.billing.analytics;
 import java.util.UUID;
 
 import org.mockito.Mockito;
-import org.skife.jdbi.v2.IDBI;
 import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.ning.billing.ObjectType;
 import com.ning.billing.account.api.Account;
-import com.ning.billing.account.api.AccountUserApi;
-import com.ning.billing.account.api.svcs.DefaultAccountInternalApi;
-import com.ning.billing.account.api.user.DefaultAccountUserApi;
-import com.ning.billing.account.dao.AccountDao;
-import com.ning.billing.account.dao.DefaultAccountDao;
-import com.ning.billing.analytics.dao.BusinessAccountTagSqlDao;
-import com.ning.billing.analytics.dao.BusinessInvoicePaymentTagSqlDao;
-import com.ning.billing.analytics.dao.BusinessInvoiceTagSqlDao;
-import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionTagSqlDao;
-import com.ning.billing.catalog.DefaultCatalogService;
-import com.ning.billing.catalog.api.CatalogService;
 import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.catalog.io.VersionedCatalogLoader;
-import com.ning.billing.entitlement.alignment.PlanAligner;
-import com.ning.billing.entitlement.api.svcs.DefaultEntitlementInternalApi;
-import com.ning.billing.entitlement.api.user.DefaultEntitlementUserApi;
-import com.ning.billing.entitlement.api.user.DefaultSubscriptionApiService;
-import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
-import com.ning.billing.entitlement.engine.addon.AddonUtils;
-import com.ning.billing.entitlement.engine.dao.DefaultEntitlementDao;
-import com.ning.billing.entitlement.engine.dao.EntitlementDao;
 import com.ning.billing.mock.MockAccountBuilder;
-import com.ning.billing.util.bus.InMemoryInternalBus;
-import com.ning.billing.util.cache.CacheControllerDispatcher;
-import com.ning.billing.util.callcontext.DefaultCallContextFactory;
-import com.ning.billing.util.callcontext.InternalCallContextFactory;
-import com.ning.billing.util.clock.Clock;
-import com.ning.billing.util.clock.ClockMock;
-import com.ning.billing.util.config.CatalogConfig;
-import com.ning.billing.util.dao.DefaultNonEntityDao;
-import com.ning.billing.util.dao.NonEntityDao;
-import com.ning.billing.util.notificationq.DefaultNotificationQueueService;
-import com.ning.billing.util.notificationq.NotificationQueueConfig;
-import com.ning.billing.util.svcapi.account.AccountInternalApi;
-import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
-
+import com.ning.billing.util.callcontext.InternalCallContext;
 
 public class TestBusinessTagRecorder extends AnalyticsTestSuiteWithEmbeddedDB {
 
-    private BusinessAccountTagSqlDao accountTagSqlDao;
-    private BusinessSubscriptionTransitionTagSqlDao subscriptionTransitionTagSqlDao;
-    private InMemoryInternalBus eventBus;
-    private DefaultCallContextFactory callContextFactory;
-    private AccountInternalApi accountApi;
-    private AccountUserApi accountUserApi;
-    private EntitlementInternalApi entitlementApi;
-    private EntitlementUserApi entitlementUserApi;
-    private BusinessTagDao tagDao;
-    private CacheControllerDispatcher controllerDispatcher;
-
-    private NotificationQueueConfig config = new NotificationQueueConfig() {
-        @Override
-        public boolean isProcessingOff() {
-            return false;
-        }
-
-        @Override
-        public int getPrefetchAmount() {
-            return 10;
-        }
-
-        @Override
-        public long getSleepTimeMs() {
-            return 3000;
-        }
-    };
-
-    @BeforeMethod(groups = "slow")
-    public void setUp() throws Exception {
-        final Clock clock = new ClockMock();
-        final IDBI dbi = helper.getDBI();
-        controllerDispatcher = new CacheControllerDispatcher();
-        final NonEntityDao nonEntityDao = new DefaultNonEntityDao(dbi);
-        accountTagSqlDao = dbi.onDemand(BusinessAccountTagSqlDao.class);
-        final BusinessInvoiceTagSqlDao invoiceTagSqlDao = dbi.onDemand(BusinessInvoiceTagSqlDao.class);
-        final BusinessInvoicePaymentTagSqlDao invoicePaymentTagSqlDao = dbi.onDemand(BusinessInvoicePaymentTagSqlDao.class);
-        subscriptionTransitionTagSqlDao = dbi.onDemand(BusinessSubscriptionTransitionTagSqlDao.class);
-        eventBus = new InMemoryInternalBus();
-        final AccountDao accountDao = new DefaultAccountDao(dbi, eventBus, clock, controllerDispatcher, new InternalCallContextFactory(new ClockMock(), nonEntityDao, controllerDispatcher), nonEntityDao);
-        callContextFactory = new DefaultCallContextFactory(clock);
-        final InternalCallContextFactory internalCallContextFactory = new InternalCallContextFactory(clock, nonEntityDao, controllerDispatcher);
-        accountApi = new DefaultAccountInternalApi(accountDao);
-        accountUserApi = new DefaultAccountUserApi(callContextFactory, internalCallContextFactory, accountDao);
-        final CatalogService catalogService = new DefaultCatalogService(Mockito.mock(CatalogConfig.class), Mockito.mock(VersionedCatalogLoader.class));
-        final AddonUtils addonUtils = new AddonUtils(catalogService);
-        final DefaultNotificationQueueService notificationQueueService = new DefaultNotificationQueueService(dbi, clock, config, internalCallContextFactory, nonEntityDao, controllerDispatcher);
-        final EntitlementDao entitlementDao = new DefaultEntitlementDao(dbi, clock, addonUtils, notificationQueueService, eventBus, catalogService, controllerDispatcher, nonEntityDao);
-        final PlanAligner planAligner = new PlanAligner(catalogService);
-        final DefaultSubscriptionApiService apiService = new DefaultSubscriptionApiService(clock, entitlementDao, catalogService, planAligner, addonUtils, internalCallContextFactory);
-        entitlementApi = new DefaultEntitlementInternalApi(entitlementDao, apiService, clock, catalogService);
-        entitlementUserApi = new DefaultEntitlementUserApi(clock, entitlementDao, catalogService, apiService, addonUtils, internalCallContextFactory);
-        tagDao = new BusinessTagDao(accountTagSqlDao, invoicePaymentTagSqlDao, invoiceTagSqlDao, subscriptionTransitionTagSqlDao,
-                                    accountApi, entitlementApi);
-
-        eventBus.start();
-    }
-
-    @AfterMethod(groups = "slow")
-    public void tearDown() throws Exception {
-        eventBus.stop();
-    }
-
     @Test(groups = "slow")
     public void testAddAndRemoveTagsForAccount() throws Exception {
         final String name = UUID.randomUUID().toString().substring(0, 20);
         final String accountKey = UUID.randomUUID().toString();
 
-        final Account accountData = new MockAccountBuilder()
+        final Account accountData = new MockAccountBuilder(UUID.randomUUID())
                 .externalKey(accountKey)
                 .currency(Currency.MXN)
                 .build();
-        final Account account = accountUserApi.createAccount(accountData, callContext);
-        final UUID accountId = account.getId();
+        Mockito.when(accountInternalApi.getAccountById(Mockito.eq(accountData.getId()), Mockito.<InternalCallContext>any())).thenReturn(accountData);
+        Mockito.when(accountInternalApi.getAccountByKey(Mockito.eq(accountData.getExternalKey()), Mockito.<InternalCallContext>any())).thenReturn(accountData);
+        final UUID accountId = accountData.getId();
 
         Assert.assertEquals(accountTagSqlDao.getTagsForAccountByKey(accountKey, internalCallContext).size(), 0);
         tagDao.tagAdded(ObjectType.ACCOUNT, accountId, name, internalCallContext);
@@ -157,9 +59,15 @@ public class TestBusinessTagRecorder extends AnalyticsTestSuiteWithEmbeddedDB {
         final Account accountData = new MockAccountBuilder()
                 .currency(Currency.MXN)
                 .build();
-        final Account account = accountUserApi.createAccount(accountData, callContext);
-        final SubscriptionBundle bundle = entitlementUserApi.createBundleForAccount(account.getId(), externalKey, callContext);
-        final UUID bundleId = bundle.getId();
+        Mockito.when(accountInternalApi.getAccountById(Mockito.eq(accountData.getId()), Mockito.<InternalCallContext>any())).thenReturn(accountData);
+        Mockito.when(accountInternalApi.getAccountByKey(Mockito.eq(accountData.getExternalKey()), Mockito.<InternalCallContext>any())).thenReturn(accountData);
+
+        final UUID bundleId = UUID.randomUUID();
+        final SubscriptionBundle bundle = Mockito.mock(SubscriptionBundle.class);
+        Mockito.when(bundle.getId()).thenReturn(bundleId);
+        Mockito.when(bundle.getAccountId()).thenReturn(accountData.getId());
+        Mockito.when(bundle.getExternalKey()).thenReturn(externalKey);
+        Mockito.when(entitlementInternalApi.getBundleFromId(Mockito.eq(bundleId), Mockito.<InternalCallContext>any())).thenReturn(bundle);
 
         Assert.assertEquals(subscriptionTransitionTagSqlDao.getTagsForBusinessSubscriptionTransitionByKey(externalKey, internalCallContext).size(), 0);
         tagDao.tagAdded(ObjectType.BUNDLE, bundleId, name, internalCallContext);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestPaymentMethodUtils.java b/analytics/src/test/java/com/ning/billing/analytics/TestPaymentMethodUtils.java
index 5c6e2e3..576cd1e 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestPaymentMethodUtils.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestPaymentMethodUtils.java
@@ -24,7 +24,7 @@ import org.testng.annotations.Test;
 
 import com.ning.billing.payment.api.PaymentMethodPlugin;
 
-public class TestPaymentMethodUtils {
+public class TestPaymentMethodUtils extends AnalyticsTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testUnknowns() throws Exception {
diff --git a/analytics/src/test/java/com/ning/billing/analytics/utils/TestRounder.java b/analytics/src/test/java/com/ning/billing/analytics/utils/TestRounder.java
index 75d0270..7c98700 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/utils/TestRounder.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/utils/TestRounder.java
@@ -21,9 +21,9 @@ import java.math.BigDecimal;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.ning.billing.analytics.AnalyticsTestSuite;
+import com.ning.billing.analytics.AnalyticsTestSuiteNoDB;
 
-public class TestRounder extends AnalyticsTestSuite {
+public class TestRounder extends AnalyticsTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testRound() throws Exception {
diff --git a/util/src/test/java/com/ning/billing/mock/glue/MockInvoiceModule.java b/util/src/test/java/com/ning/billing/mock/glue/MockInvoiceModule.java
index 5ecb4c3..fee931a 100644
--- a/util/src/test/java/com/ning/billing/mock/glue/MockInvoiceModule.java
+++ b/util/src/test/java/com/ning/billing/mock/glue/MockInvoiceModule.java
@@ -27,6 +27,7 @@ import com.ning.billing.util.svcapi.invoice.InvoiceInternalApi;
 import com.google.inject.AbstractModule;
 
 public class MockInvoiceModule extends AbstractModule implements InvoiceModule {
+
     @Override
     public void installInvoiceUserApi() {
         bind(InvoiceUserApi.class).toInstance(Mockito.mock(InvoiceUserApi.class));
diff --git a/util/src/test/java/com/ning/billing/mock/glue/MockPaymentModule.java b/util/src/test/java/com/ning/billing/mock/glue/MockPaymentModule.java
index d3505f0..0c1271c 100644
--- a/util/src/test/java/com/ning/billing/mock/glue/MockPaymentModule.java
+++ b/util/src/test/java/com/ning/billing/mock/glue/MockPaymentModule.java
@@ -19,12 +19,15 @@ package com.ning.billing.mock.glue;
 import org.mockito.Mockito;
 
 import com.ning.billing.payment.api.PaymentApi;
+import com.ning.billing.util.svcapi.payment.PaymentInternalApi;
 
 import com.google.inject.AbstractModule;
 
 public class MockPaymentModule extends AbstractModule {
+
     @Override
     protected void configure() {
         bind(PaymentApi.class).toInstance(Mockito.mock(PaymentApi.class));
+        bind(PaymentInternalApi.class).toInstance(Mockito.mock(PaymentInternalApi.class));
     }
 }
diff --git a/util/src/test/java/com/ning/billing/mock/MockAccountBuilder.java b/util/src/test/java/com/ning/billing/mock/MockAccountBuilder.java
index 28d59a7..8e72a6e 100644
--- a/util/src/test/java/com/ning/billing/mock/MockAccountBuilder.java
+++ b/util/src/test/java/com/ning/billing/mock/MockAccountBuilder.java
@@ -50,6 +50,8 @@ public class MockAccountBuilder {
     private String phone = "";
     private boolean migrated;
     private boolean isNotifiedForInvoices;
+    private DateTime createdDate = new DateTime(DateTimeZone.UTC);
+    private DateTime updatedDate = new DateTime(DateTimeZone.UTC);
 
     public MockAccountBuilder() {
         this(UUID.randomUUID());
@@ -177,16 +179,26 @@ public class MockAccountBuilder {
         return this;
     }
 
+    public MockAccountBuilder createdDate(final DateTime createdDate) {
+        this.createdDate = createdDate;
+        return this;
+    }
+
+    public MockAccountBuilder updatedDate(final DateTime updatedDate) {
+        this.updatedDate = updatedDate;
+        return this;
+    }
+
     public Account build() {
         return new Account() {
             @Override
             public DateTime getCreatedDate() {
-                throw new UnsupportedOperationException();
+                return createdDate;
             }
 
             @Override
             public DateTime getUpdatedDate() {
-                throw new UnsupportedOperationException();
+                return updatedDate;
             }
 
             @Override