laMer007
> Все что с ними - просто напрочь не тестируемо и не тестируется.
Что это за проблемы тестирования из-за сингелтонов?
Kartonagnick
Вы всегда так пишите, что кажется что вот он почти конец... Разворачиваешь, а там ещё абзац, снова уверен вот он конец и снова и снова...
Kartonagnick
Как подменять синглтон на новый синглтон-заглушку для теста некого модуля, в котором находится обращение к синглтону? Ну вот например чтобы во время теста перестал писать в лог. Или наоборот, чтобы на время теста записывал все в массив, а потом тестовый фреймворк по содержимому массива вычислил корректность результата.
?
laMer007
> Как подменять синглтон на новый синглтон-заглушку для теста некого модуля, в
> котором находится обращение к синглтону? Ну вот например чтобы во время теста
> перестал писать в лог. Или наоборот, чтобы на время теста записывал все в
> массив, а потом тестовый фреймворк по содержимому массива вычислил корректность
> результата.
> ?
Обычно, если механизм изначально писался по методике тестирования, то в нем изначально предусматривается все необходимое для возможности проведения простых тестов.
Если жеж нужно тестировать то, что уже было написано, тогда приходится выкручиваться.
Например вот так:
Kartonagnick
жуть, не бойтесь виртуальных сервисов)
у меня реализация подмены mute-sound service происходит на этапе инициализации когда система понимает что OAL она инициализировать не может(нет дров) и вся игра работает корректно, отыгрывает звуки - правильное время и тд. это важно
IROV..
> жуть, не бойтесь виртуальных сервисов)
Не очевидно, что вы такого жуткого разглядели.
Что касается сервисов - я вроде бы не давал повода думать, будто бы боюсь их.
Я дал повод подумать о том, что необходимо пользователю для работы, и сплясать от этой необходимости, не нагружая его неинтересными ему деталями.
Не являюсь сторонником повсеместного применения синглтонов, но при работе с JNI они довольно удобны.
Для преобразования Java-класса в C++-класс и наоборот завел такую штуку:
class PositionClassInfo { JNIEnv* env; jclass cls; jfieldID xField; jfieldID yField; jmethodID ctor; public: PositionClassInfo(JNIEnv* env) : env( env) { cls = env->FindClass( "com/test/Position"); cls = ( jclass)env->NewGlobalRef( cls); xField = env->GetFieldID( cls, "x", "F"); yField = env->GetFieldID( cls, "y", "F"); ctor = env->GetMethodID( cls, "<init>", "()V"); } jobject createNew( const vec2& value) const { jobject obj = env->NewObject( cls, ctor); setValue( obj, value); return obj; } vec2 getValue( jobject obj) const { float x = env->GetFloatField( obj, xField); float y = env->GetFloatField( obj, yField); return vec2( x, y); } void setValue( jobject obj, const vec2& value) const { env->SetFloatField( obj, xField, value.x); env->SetFloatField( obj, yField, value.y); } static const PositionClassInfo& get( JNIEnv* env) { static __thread PositionClassInfo instance( env); return instance; } };
Usage:
JNIEXPORT jobject JNICALL jni_method(JNIEnv* env, jobject p) { const auto& classInfo = PositionClassInfo::get( env); vec2 v = classInfo.getValue( p); return classInfo.createNew( v * 2); }
Тема в архиве.