killbill-memoizeit

refactored account & fieldstore so that they no longer depend

11/26/2011 12:25:11 AM

Changes

account/src/main/java/com/ning/billing/account/api/IFieldStore.java 33(+0 -33)

account/src/main/java/com/ning/billing/account/glue/InjectorMagic.java 57(+0 -57)

account/src/main/resources/com/ning/billing/account/dao/IFieldStoreDao.sql.stg 24(+0 -24)

analytics/src/test/java/com/ning/billing/analytics/MockAccount.java 102(+0 -102)

pom.xml 6(+6 -0)

Details

diff --git a/account/src/main/java/com/ning/billing/account/api/Account.java b/account/src/main/java/com/ning/billing/account/api/Account.java
index 66f8c5d..e1bc6dd 100644
--- a/account/src/main/java/com/ning/billing/account/api/Account.java
+++ b/account/src/main/java/com/ning/billing/account/api/Account.java
@@ -16,15 +16,13 @@
 
 package com.ning.billing.account.api;
 
-import com.ning.billing.account.dao.IAccountDao;
-import com.ning.billing.account.glue.InjectorMagic;
-import com.ning.billing.catalog.api.Currency;
-
 import java.util.UUID;
 
+import com.ning.billing.catalog.api.Currency;
+
 public class Account implements IAccount {
-    private final FieldStore fields;
-    private static IAccountDao dao;
+    public static final String OBJECT_TYPE = "Account";
+    private final IFieldStore fields;
 
     private final UUID id;
     private String key;
@@ -40,8 +38,7 @@ public class Account implements IAccount {
 
     public Account(UUID id) {
         this.id = id;
-        fields = FieldStore.create(getId(), getObjectName());
-        dao = InjectorMagic.getAccountDao();
+        fields = new FieldStore();
     }
 
    @Override
@@ -117,20 +114,9 @@ public class Account implements IAccount {
         return new Account(id);
     }
 
-    public static Account loadAccount(UUID id) {
-        Account account = (Account) dao.getAccountById(id);
-        if (account != null) {
-            account.loadCustomFields();
-        }
-        return account;
-    }
-
-    public static Account loadAccount(String key) {
-        Account account = (Account) dao.getAccountByKey(key);
-        if (account != null) {
-            account.loadCustomFields();
-        }
-        return account;
+    @Override
+    public IFieldStore getFields() {
+        return fields;
     }
 
     @Override
@@ -142,42 +128,4 @@ public class Account implements IAccount {
     public void setFieldValue(String fieldName, String fieldValue) {
         fields.setValue(fieldName, fieldValue);
     }
-
-    @Override
-    public void save() {
-        saveObject();
-        saveCustomFields();
-    }
-
-    @Override
-    public void load() {
-        loadObject();
-        loadCustomFields();
-    }
-
-    private void saveCustomFields() {
-        fields.save();
-    }
-
-    protected void loadCustomFields() {
-        fields.load();
-    }
-
-    public String getObjectName() {
-        return "Account";
-    }
-
-    private void saveObject() {
-        dao.save(this);
-    }
-
-    private void loadObject() {
-        IAccount that = dao.getAccountById(id);
-        this.key = that.getKey();
-        this.email = that.getEmail();
-        this.name = that.getName();
-        this.phone = that.getPhone();
-        this.currency = that.getCurrency();
-        this.billCycleDay = that.getBillCycleDay();
-    }
 }
diff --git a/account/src/main/java/com/ning/billing/account/api/FieldStore.java b/account/src/main/java/com/ning/billing/account/api/FieldStore.java
index 2d1da7f..fe07b9f 100644
--- a/account/src/main/java/com/ning/billing/account/api/FieldStore.java
+++ b/account/src/main/java/com/ning/billing/account/api/FieldStore.java
@@ -16,25 +16,15 @@
 
 package com.ning.billing.account.api;
 
-import com.ning.billing.account.dao.IFieldStoreDao;
-import com.ning.billing.account.glue.InjectorMagic;
-
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 public class FieldStore implements IFieldStore {
-    private Map<String, ICustomField> fields = new HashMap<String, ICustomField>();
-    private final UUID objectId;
-    private final String objectType;
-
-    public FieldStore(UUID objectId, String objectType) {
-        this.objectId = objectId;
-        this.objectType = objectType;
-    }
-
-    public static FieldStore create(UUID objectId, String objectType) {
-        return new FieldStore(objectId, objectType);
-    }
+    private final Map<String, ICustomField> fields = new HashMap<String, ICustomField>();
 
+    @Override
     public void setValue(String fieldName, String fieldValue) {
         if (fields.containsKey(fieldName)) {
             fields.get(fieldName).setValue(fieldValue);
@@ -43,6 +33,7 @@ public class FieldStore implements IFieldStore {
         }
     }
 
+    @Override
     public String getValue(String fieldName) {
         if (fields.containsKey(fieldName)) {
             return fields.get(fieldName).getValue();
@@ -75,26 +66,8 @@ public class FieldStore implements IFieldStore {
         return updatedFields;
     }
 
-    public void save() {
-        IFieldStoreDao dao = InjectorMagic.getFieldStoreDao();
-
-        List<ICustomField> newFields = getNewFields();
-        dao.createFields(objectId.toString(), objectType, newFields);
-        for (ICustomField field : newFields) {
-            field.setAsSaved();
-        }
-
-        dao.saveFields(objectId.toString(), objectType, getUpdatedFields());
-    }
-
-    public void load() {
-        IFieldStoreDao dao = InjectorMagic.getFieldStoreDao();
-        List<ICustomField> fields = dao.getFields(objectId.toString(), objectType);
+    @Override
+    public void clear() {
         this.fields.clear();
-        if (fields != null) {
-            for (ICustomField field : fields) {
-                this.fields.put(field.getName(), field);
-            }
-        }
     }
 }
\ No newline at end of file
diff --git a/account/src/main/java/com/ning/billing/account/dao/AccountDao.java b/account/src/main/java/com/ning/billing/account/dao/AccountDao.java
index 15bf60f..32e1d0d 100644
--- a/account/src/main/java/com/ning/billing/account/dao/AccountDao.java
+++ b/account/src/main/java/com/ning/billing/account/dao/AccountDao.java
@@ -16,14 +16,16 @@
 
 package com.ning.billing.account.dao;
 
+import java.util.List;
+import java.util.UUID;
+
+import org.skife.jdbi.v2.IDBI;
+
 import com.google.inject.Inject;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.IAccount;
 import com.ning.billing.account.api.IAccountData;
-import org.skife.jdbi.v2.IDBI;
-
-import java.util.List;
-import java.util.UUID;
+import com.ning.billing.account.api.ICustomField;
 
 public class AccountDao implements IAccountDao {
 
@@ -43,12 +45,30 @@ public class AccountDao implements IAccountDao {
 
     @Override
     public IAccount getAccountByKey(String key) {
-        return dao.getAccountByKey(key);
+        IAccount account = dao.getAccountByKey(key);
+        if (account != null) {
+            loadFields(account);
+        }
+        return account;
     }
 
     @Override
     public IAccount getAccountById(UUID uid) {
-        return dao.getAccountFromId(uid.toString());
+        IAccount account = dao.getAccountFromId(uid.toString());
+        if (account != null) {
+            loadFields(account);
+        }
+        return account;
+    }
+
+    private void loadFields(IAccount account) {
+        List<ICustomField> fields = dao.getFields(account.getId().toString(), Account.OBJECT_TYPE);
+        account.getFields().clear();
+        if (fields != null) {
+            for (ICustomField field : fields) {
+                account.getFields().setValue(field.getName(), field.getValue());
+            }
+        }
     }
 
     @Override
@@ -63,6 +83,24 @@ public class AccountDao implements IAccountDao {
 
     @Override
     public void save(IAccount account) {
-        dao.insertAccount(account);
+        final String objectId = account.getId().toString();
+        final String objectType = Account.OBJECT_TYPE;
+
+        dao.begin();
+        try {
+            dao.insertAccount(account);
+            List<ICustomField> newFields = account.getFields().getNewFields();
+            dao.createFields(objectId, objectType, newFields);
+            for (ICustomField field : newFields) {
+                field.setAsSaved();
+            }
+
+            dao.saveFields(objectId, objectType, account.getFields().getUpdatedFields());
+            dao.commit();
+        }
+        catch (RuntimeException ex) {
+            dao.rollback();
+            throw ex;
+        }
     }
 }
diff --git a/account/src/main/java/com/ning/billing/account/dao/IAccountDao.java b/account/src/main/java/com/ning/billing/account/dao/IAccountDao.java
index e23fbfa..1a4314f 100644
--- a/account/src/main/java/com/ning/billing/account/dao/IAccountDao.java
+++ b/account/src/main/java/com/ning/billing/account/dao/IAccountDao.java
@@ -16,12 +16,12 @@
 
 package com.ning.billing.account.dao;
 
-import com.ning.billing.account.api.IAccount;
-import com.ning.billing.account.api.IAccountData;
-
 import java.util.List;
 import java.util.UUID;
 
+import com.ning.billing.account.api.IAccount;
+import com.ning.billing.account.api.IAccountData;
+
 public interface IAccountDao {
 
     public IAccount createAccount(IAccountData account);
diff --git a/account/src/main/java/com/ning/billing/account/dao/IAccountDaoSql.java b/account/src/main/java/com/ning/billing/account/dao/IAccountDaoSql.java
index 7cb9eda..ea133bc 100644
--- a/account/src/main/java/com/ning/billing/account/dao/IAccountDaoSql.java
+++ b/account/src/main/java/com/ning/billing/account/dao/IAccountDaoSql.java
@@ -16,8 +16,11 @@
 
 package com.ning.billing.account.dao;
 
-import com.ning.billing.account.api.Account;
-import com.ning.billing.account.api.IAccount;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.List;
+import java.util.UUID;
+
 import org.skife.jdbi.v2.SQLStatement;
 import org.skife.jdbi.v2.StatementContext;
 import org.skife.jdbi.v2.sqlobject.Bind;
@@ -30,13 +33,11 @@ import org.skife.jdbi.v2.sqlobject.mixins.Transactional;
 import org.skife.jdbi.v2.sqlobject.stringtemplate.ExternalizedSqlViaStringTemplate3;
 import org.skife.jdbi.v2.tweak.ResultSetMapper;
 
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.List;
-import java.util.UUID;
+import com.ning.billing.account.api.Account;
+import com.ning.billing.account.api.IAccount;
 
 @ExternalizedSqlViaStringTemplate3()
-public interface IAccountDaoSql extends Transactional<IAccountDaoSql>, CloseMe {
+public interface IAccountDaoSql extends IFieldStoreDao, Transactional<IAccountDaoSql>, CloseMe {
 
     @SqlUpdate
     public void insertAccount(@Bind(binder = IAccountSqlBinder.class) IAccount account);
@@ -53,6 +54,7 @@ public interface IAccountDaoSql extends Transactional<IAccountDaoSql>, CloseMe {
     @Mapper(IAccountSqlMapper.class)
     public List<IAccount> getAccounts();
 
+    @Override
     @SqlUpdate
     public void test();
 
diff --git a/account/src/main/java/com/ning/billing/account/glue/AccountModule.java b/account/src/main/java/com/ning/billing/account/glue/AccountModule.java
index b4583ec..1257928 100644
--- a/account/src/main/java/com/ning/billing/account/glue/AccountModule.java
+++ b/account/src/main/java/com/ning/billing/account/glue/AccountModule.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.account.glue;
 
+import org.skife.config.ConfigurationObjectFactory;
+
 import com.google.inject.AbstractModule;
 import com.ning.billing.account.api.AccountService;
 import com.ning.billing.account.api.AccountUserApi;
@@ -26,8 +28,6 @@ import com.ning.billing.account.dao.FieldStoreDao;
 import com.ning.billing.account.dao.IAccountDao;
 import com.ning.billing.account.dao.IFieldStoreDao;
 
-import org.skife.config.ConfigurationObjectFactory;
-
 public class AccountModule extends AbstractModule {
 
     protected void installConfig() {
@@ -52,11 +52,6 @@ public class AccountModule extends AbstractModule {
         bind(IFieldStoreDao.class).to(FieldStoreDao.class).asEagerSingleton();
     }
 
-    protected void installInjectorMagic() {
-        bind(InjectorMagic.class).asEagerSingleton();
-    }
-
-
     @Override
     protected void configure() {
         installConfig();
@@ -64,7 +59,6 @@ public class AccountModule extends AbstractModule {
         installAccountUserApi();
         installAccountService();
         installFieldStore();
-        installInjectorMagic();
     }
 
 }
diff --git a/account/src/main/resources/com/ning/billing/account/dao/IAccountDaoSql.sql.stg b/account/src/main/resources/com/ning/billing/account/dao/IAccountDaoSql.sql.stg
index c7fa4fa..12c0fc7 100644
--- a/account/src/main/resources/com/ning/billing/account/dao/IAccountDaoSql.sql.stg
+++ b/account/src/main/resources/com/ning/billing/account/dao/IAccountDaoSql.sql.stg
@@ -41,4 +41,20 @@ getAccounts() ::= <<
     from accounts
     ;
 >>
-;
\ No newline at end of file
+
+createFields() ::= <<
+  INSERT INTO custom_fields(id, object_id, object_type, field_name, field_value)
+  VALUES (:idAsString, :objectId, :objectType, :name, :value);
+>>
+
+saveFields() ::= <<
+    UPDATE custom_fields
+    SET object_type = :objectType, object_id = :objectId, field_name = :name, field_value = :value
+    WHERE id = :id;
+>>
+
+getFields() ::= <<
+    SELECT id, field_name, field_value
+    FROM custom_fields
+    WHERE object_id = :objectId AND object_type = :objectType;
+>>
diff --git a/account/src/test/java/com/ning/billing/account/dao/TestSimpleAccountDao.java b/account/src/test/java/com/ning/billing/account/dao/TestSimpleAccountDao.java
index 3b4a687..b18b600 100644
--- a/account/src/test/java/com/ning/billing/account/dao/TestSimpleAccountDao.java
+++ b/account/src/test/java/com/ning/billing/account/dao/TestSimpleAccountDao.java
@@ -16,27 +16,29 @@
 
 package com.ning.billing.account.dao;
 
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.fail;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.commons.io.IOUtils;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.Stage;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.IAccount;
 import com.ning.billing.account.glue.AccountModuleMock;
-import com.ning.billing.account.glue.InjectorMagic;
-import org.apache.commons.io.IOUtils;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.UUID;
-
-import static org.testng.Assert.*;
 
 @Test(groups = {"Account", "Account-DAO"})
 public class TestSimpleAccountDao {
     private IAccountDao dao;
-    private InjectorMagic injectorMagic;
 
     @BeforeClass(alwaysRun = true)
     private void setup() throws IOException {
@@ -48,7 +50,6 @@ public class TestSimpleAccountDao {
         try {
             final Injector injector = Guice.createInjector(Stage.DEVELOPMENT, module);
 
-            injectorMagic = injector.getInstance(InjectorMagic.class);
             dao = injector.getInstance(IAccountDao.class);
             dao.test();
         }
@@ -83,9 +84,9 @@ public class TestSimpleAccountDao {
         IAccount account = Account.create().withKey(key);
         UUID id = account.getId();
 
-        account.save();
+        dao.save(account);
 
-        account = Account.loadAccount(id);
+        account = dao.getAccountById(id);
         assertNotNull(account);
         assertEquals(account.getId(), id);
         assertEquals(account.getKey(), key);
@@ -100,9 +101,9 @@ public class TestSimpleAccountDao {
         String fieldValue = "testField1_value";
         account.setFieldValue(fieldName, fieldValue);
 
-        account.save();
+        dao.save(account);
 
-        account = Account.loadAccount(key);
+        account = dao.getAccountByKey(key);
         assertNotNull(account);
         assertEquals(account.getKey(), key);
         assertEquals(account.getFieldValue(fieldName), fieldValue);
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 f4f7c9c..1bf2682 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,14 +16,27 @@
 
 package com.ning.billing.analytics.api;
 
+import java.io.IOException;
+import java.sql.SQLException;
+import java.util.UUID;
+
+import org.apache.commons.io.IOUtils;
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
 import com.google.inject.Inject;
+import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.IAccount;
 import com.ning.billing.account.api.IAccountUserApi;
 import com.ning.billing.analytics.AnalyticsTestModule;
 import com.ning.billing.analytics.BusinessSubscription;
 import com.ning.billing.analytics.BusinessSubscriptionEvent;
 import com.ning.billing.analytics.BusinessSubscriptionTransition;
-import com.ning.billing.analytics.MockAccount;
 import com.ning.billing.analytics.MockDuration;
 import com.ning.billing.analytics.MockPhase;
 import com.ning.billing.analytics.MockPlan;
@@ -45,18 +58,6 @@ import com.ning.billing.entitlement.api.user.SubscriptionTransition;
 import com.ning.billing.entitlement.events.IEvent;
 import com.ning.billing.entitlement.events.user.ApiEventType;
 import com.ning.billing.util.eventbus.IEventBus;
-import org.apache.commons.io.IOUtils;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
-import org.testng.Assert;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Guice;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.sql.SQLException;
-import java.util.UUID;
 
 @Guice(modules = AnalyticsTestModule.class)
 public class TestAnalyticsService
@@ -99,7 +100,7 @@ public class TestAnalyticsService
         helper.initDb(entitlementDdl);
 
         // We need a bundle to retrieve the event key
-        final MockAccount account = new MockAccount(UUID.randomUUID(), ACCOUNT_KEY, Currency.USD);
+        final Account account = new Account(UUID.randomUUID()).withKey(ACCOUNT_KEY).withCurrency(Currency.USD);
         final IAccount storedAccount = accountApi.createAccount(account);
         final ISubscriptionBundle bundle = entitlementApi.createBundleForAccount(storedAccount, KEY);
 
diff --git a/analytics/src/test/java/com/ning/billing/analytics/MockIAccountUserApi.java b/analytics/src/test/java/com/ning/billing/analytics/MockIAccountUserApi.java
index ccd67af..36f54f8 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/MockIAccountUserApi.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/MockIAccountUserApi.java
@@ -16,21 +16,22 @@
 
 package com.ning.billing.analytics;
 
+import java.util.List;
+import java.util.UUID;
+
+import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.IAccount;
 import com.ning.billing.account.api.IAccountData;
 import com.ning.billing.account.api.IAccountUserApi;
 import com.ning.billing.catalog.api.Currency;
 
-import java.util.List;
-import java.util.UUID;
-
 public class MockIAccountUserApi implements IAccountUserApi
 {
-    private final MockAccount account;
+    private final Account account;
 
     public MockIAccountUserApi(final String accountKey, final Currency currency)
     {
-        account = new MockAccount(UUID.randomUUID(), accountKey, currency);
+        account = new Account(UUID.randomUUID()).withKey(accountKey).withCurrency(currency);
     }
 
     @Override
diff --git a/api/src/main/java/com/ning/billing/account/api/IAccount.java b/api/src/main/java/com/ning/billing/account/api/IAccount.java
index 41908bb..2129c5d 100644
--- a/api/src/main/java/com/ning/billing/account/api/IAccount.java
+++ b/api/src/main/java/com/ning/billing/account/api/IAccount.java
@@ -21,9 +21,7 @@ import java.util.UUID;
 public interface IAccount extends IAccountData {
     public UUID getId();
 
-    public void load();
-
-    public void save();
+    public IFieldStore getFields();
 
     public String getFieldValue(String fieldName);
 
diff --git a/api/src/main/java/com/ning/billing/account/api/IFieldStore.java b/api/src/main/java/com/ning/billing/account/api/IFieldStore.java
new file mode 100644
index 0000000..1ecb9b2
--- /dev/null
+++ b/api/src/main/java/com/ning/billing/account/api/IFieldStore.java
@@ -0,0 +1,14 @@
+package com.ning.billing.account.api;
+
+import java.util.List;
+
+public interface IFieldStore {
+    void clear();
+    void setValue(String fieldName, String fieldValue);
+
+    String getValue(String fieldName);
+
+    List<ICustomField> getNewFields();
+
+    List<ICustomField> getUpdatedFields();
+}
diff --git a/entitlement/pom.xml b/entitlement/pom.xml
index 6bd2ee7..b73fb04 100644
--- a/entitlement/pom.xml
+++ b/entitlement/pom.xml
@@ -52,6 +52,11 @@
         </dependency>
         <dependency>
             <groupId>com.ning.billing</groupId>
+            <artifactId>killbill-account</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.ning.billing</groupId>
             <artifactId>killbill-util</artifactId>
             <type>test-jar</type>
             <scope>test</scope>
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java
index 5306ba8..ae627dc 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java
@@ -16,10 +16,35 @@
 
 package com.ning.billing.entitlement.api.user;
 
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.List;
+
+import org.joda.time.DateTime;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+
 import com.google.inject.Injector;
+import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.IAccount;
 import com.ning.billing.catalog.CatalogService;
-import com.ning.billing.catalog.api.*;
+import com.ning.billing.catalog.api.BillingPeriod;
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.catalog.api.ICatalog;
+import com.ning.billing.catalog.api.ICatalogService;
+import com.ning.billing.catalog.api.IDuration;
+import com.ning.billing.catalog.api.TimeUnit;
 import com.ning.billing.config.IEntitlementConfig;
 import com.ning.billing.entitlement.api.ApiTestListener;
 import com.ning.billing.entitlement.api.ApiTestListener.NextEvent;
@@ -38,23 +63,6 @@ import com.ning.billing.util.clock.ClockMock;
 import com.ning.billing.util.clock.IClock;
 import com.ning.billing.util.eventbus.EventBusService;
 import com.ning.billing.util.eventbus.IEventBusService;
-import org.joda.time.DateTime;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-
-import java.io.IOException;
-import java.lang.reflect.Method;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-
-import static org.testng.Assert.*;
 
 
 public abstract class TestUserApiBase {
@@ -278,52 +286,12 @@ public abstract class TestUserApiBase {
     }
 
     protected IAccount getAccount() {
-        IAccount account = new IAccount() {
-            @Override
-            public String getName() {
-                return "accountName";
-            }
-            @Override
-            public String getEmail() {
-                return "accountName@yahoo.com";
-            }
-            @Override
-            public String getPhone() {
-                return "4152876341";
-            }
-            @Override
-            public String getKey() {
-                return "k123456";
-            }
-            @Override
-            public int getBillCycleDay() {
-                return 1;
-            }
-            @Override
-            public Currency getCurrency() {
-                return Currency.USD;
-            }
-
-            @Override
-            public UUID getId() {
-                return UUID.randomUUID();
-            }
-
-            @Override
-            public void load() {}
-
-            @Override
-            public void save() {}
-
-            @Override
-            public String getFieldValue(String fieldName) {
-                return null;
-            }
-
-            @Override
-            public void setFieldValue(String fieldName, String fieldValue) {}
-        };
-        return account;
+        return new Account().withName("accountName")
+                            .withEmail("accountName@yahoo.com")
+                            .withPhone("4152876341")
+                            .withKey("k123456")
+                            .withBillCycleDay(1)
+                            .withCurrency(Currency.USD);
     }
 
 

pom.xml 6(+6 -0)

diff --git a/pom.xml b/pom.xml
index 3e0c587..be47827 100644
--- a/pom.xml
+++ b/pom.xml
@@ -61,6 +61,12 @@
             </dependency>
             <dependency>
                 <groupId>com.ning.billing</groupId>
+                <artifactId>killbill-account</artifactId>
+                <version>${project.version}</version>
+                <classifier>tests</classifier>
+            </dependency>
+            <dependency>
+                <groupId>com.ning.billing</groupId>
                 <artifactId>killbill-entitlement</artifactId>
                 <version>${project.version}</version>
             </dependency>