как издеваться над классом, который вызывает одноэлементный класс, используя junit

Я хотел бы протестировать метод из class1, который вызывает одноэлементный класс getInstance:

Class ivDomain {

    public String method1() {

        id=Singleton.getInstance().generateId()

        ... code

    }

}

Когда я делаю тест с помощью Junit, я получаю NullPointerException в классе singleton. Как я могу это исправить?


person Tejas Shah    schedule 01.05.2011    source источник
comment
Я бы предположил, что у вас есть ошибка в вашем одноэлементном коде. Есть ли причина, по которой вы не используете простое перечисление для своего синглтона?   -  person Peter Lawrey    schedule 01.05.2011


Ответы (4)


Классы, использующие синглтоны со статическим доступом, сложно тестировать. Измените класс ivDomain так, чтобы он скорее брал экземпляр singleton в качестве параметра для его конструктора, а затем нормально издевался над ним. Вам следует использовать структуру внедрения зависимостей (например, Guice), чтобы сделать этот стиль развития проще.

person alpian    schedule 01.05.2011

Вам не нужно издеваться над Синглтоном; просто измените код, чтобы getInstance() не возвращал значение null.

person duffymo    schedule 01.05.2011

Наиболее вероятная причина - без изучения кода вашего синглтона - заключается в том, что при его инициализации не удается загрузить некоторую внешнюю конфигурацию и, следовательно, происходит сбой.

Синглтоны в автоматических модульных тестах могут быть проблемой, поскольку иногда вам нужно, чтобы они вели себя по-разному для конкретного тестируемого сценария (например, вам нужен один сценарий, в котором generateId возвращает -1, другой, когда он возвращает 4354353, и еще один, когда он выдает RuntimeException - просто так) вы можете увидеть, как работает код, использующий Singleton.В таких случаях рекомендуется изменение дизайна, поскольку Singletons не входят в число предпочтительных шаблонов проектирования и в некоторой степени считаются анти-шаблонами.

person RonK    schedule 01.05.2011
comment
На самом деле я тестирую не одноэлементный код, а метод в ivDomain ivDomain.method1, но у метода1 есть вызов одноэлементного класса, поэтому в этот момент он терпит неудачу и не идет дальше. - person Tejas Shah; 02.05.2011
comment
вот пакет одноэлементного кода com.cboe.bo.common.utils; импортировать java.util.TreeMap; импортировать com.cboe.exceptions.ExceptionDetails; импортировать com.cboe.exceptions.NotFoundException; импортировать com.cboe.infrastructureServices.foundationFramework.FoundationFramework; импортировать com.cboe.infrastructureServices.foundationFramework.utilities.Log; импортировать com.cboe.infrastructureServices.instrumentationService.EntityID; импортировать com.cboe.instrumentationService.transactionTimingCommon.TransactionTimer; открытый класс TransactionTimerUtility { - person Tejas Shah; 02.05.2011
comment
частный статический TransactionTimerUtility tteUtility = null; частный статический TransactionTimer transactionTimer = null; защищенное логическое значение infoLogStatus = false; защищенное логическое значение sqlLogStatus = false; общедоступный статический короткий sourceNumber; частная статическая строка isActiveMethod = Y; общедоступный статический интервал Enter = 0; общедоступный статический интервал Оставить = 1; общедоступный статический интервал LeaveWithException = 2; частная статическая строка transactionTimerIndicator; частная статическая финальная строка TTE_REMOTE_VALUE = local; частные статические имена методов String[]; - person Tejas Shah; 02.05.2011
comment
частные статические TreeMap‹String, Long› идентификаторы методов; частная статическая TreeMap‹String, String› isActiveMethods; private static Long nextID = (long) 0; private static ThreadLocal‹Long› tLocal = new ThreadLocal‹Long›() { защищенный синхронизированный Long initialValue() { return new Long(nextID++); }}; private static Long get() { return (Long) tLocal.get(); } public TransactionTimerUtility() { infoLogStatus = LogHelper.getInfoLogStatus(); sqlLogStatus = LogHelper.getSqlLogStatus(); } - person Tejas Shah; 02.05.2011
comment
статический { transactionTimerIndicator = (System.getProperty (transactionTimer) == null)? TTE_REMOTE_VALUE : System.getProperty(transactionTimer); if (transactionTimerIndicator.equalsIgnoreCase(TTE_REMOTE_VALUE)) { transactionTimer = FoundationFramework.getInstance() .getInstrumentationService().getTransactionTimerFactory().getLocalTransactionTimer(); } else { transactionTimer = FoundationFramework.getInstance() .getInstrumentationService().getTransactionTimerFactory().getRemoteTransactionTimer(); } - person Tejas Shah; 02.05.2011
comment
if (System.getProperty(sourceNumber)!= null) { sourceNumber = Short.valueOf(System.getProperty(sourceNumber)); } Строковые методы = System.getProperty(methodNames); if (methods!= null) { methodNames = method.split (,); System.out.println (имена методов + имена методов); } methodIds = new TreeMap‹String, Long›(); isActiveMethods = new TreeMap‹String, String›(); - person Tejas Shah; 02.05.2011
comment
for (String entry: methodNames) { methodIds.put(entry, transactionTimer.registerTransactionIdentifier(entry)); isActiveMethods.put(запись, isActiveMethod); } } public long generateTransId(String reqNbr) { long transId = 0; if (reqNbr != null) { if (reqNbr.equals(0)) transId = get(); иначе transId = Long.valueOf(reqNbr); transId = EntityID.createID(EntityID.TT_CAS, sourceNumber, Long.valueOf(reqNbr)); Log.information( TransId из hashCode: + transId); } // Если transId равен 0, у нас проблема. возврат TransId; } - person Tejas Shah; 02.05.2011
comment
// Получить экземпляр TransactionTimerUtility (singleton) public static TransactionTimerUtility getInstance() { return tteUtility; } } - person Tejas Shah; 02.05.2011
comment
@Tejas Shah: Можете ли вы опубликовать этот код в вопросе в качестве редактирования? это не очень читабельно в такой манере - person RonK; 02.05.2011
comment
Спасибо, ребята, я нашел свою проблему. - person Tejas Shah; 03.05.2011

проверьте насмешку над одноэлементным классом

person Lucas de Oliveira    schedule 01.05.2011