Этот метод делает то же самое, но немного проще и, возможно, немного более производительно, и, если вы используете отражение, он автоматически пропускает эти кадры. Единственная проблема заключается в том, что он может отсутствовать в JVM не от Sun, хотя он включен в классы выполнения JRockit 1.4 -> 1.6. (Дело в том, что это не публичный класс).
sun.reflect.Reflection
/** Returns the class of the method <code>realFramesToSkip</code>
frames up the stack (zero-based), ignoring frames associated
with java.lang.reflect.Method.invoke() and its implementation.
The first frame is that associated with this method, so
<code>getCallerClass(0)</code> returns the Class object for
sun.reflect.Reflection. Frames associated with
java.lang.reflect.Method.invoke() and its implementation are
completely ignored and do not count toward the number of "real"
frames skipped. */
public static native Class getCallerClass(int realFramesToSkip);
Что касается значения realFramesToSkip
, версии VM для Sun 1.5 и 1.6 java.lang.System
, то существует защищенный пакетный метод getCallerClass (), который вызывает sun.reflect.Reflection.getCallerClass(3)
, но в моем помощнике служебный класс Я использовал 4, так как добавлен фрейм вызова вспомогательного класса.
Добавляя неопределенный символ в main, он просто означает создание любого случайного внешнего символа, чтобы заставить компоновщик искать ваши внешние библиотеки, содержащие тест код.
Например, предполагая две тестовые библиотеки, fred и barney, в fredTestLib.cpp вы просто добавляете эту строку:
int fredDummyInt = 0; // declare a unique symbol for the linker to resolve
, а в barneyTestLib.cpp вы бы добавляете аналогичную строку:
int barneyDummyInt = 0; // a different unique symbol for the linker to resolve
Вы можете компилируйте каждую библиотеку отдельно на разных этапах. Затем в основной тестовой программе вы заставляете компоновщик разрешить их. Так что добавьте эти строки в main.cpp:
extern int fredDummyInt;
extern int barneyDummyInt;
...
main () {
...
fredDummyInt++; // give the linker some symbols to resolve
barneyDummyInt++;
...
Идея (согласно тому, что говорит автор вышеупомянутого трюка) заключается в том, что, поскольку компоновщик уже ищет fredTest.lib для fredDummyInt, он также найдет и разрешит ваши автоматически зарегистрированные тесты.
Примечание: я не пробовал это, чтобы увидеть, работает ли это! Я просто отвечаю на ваш вопрос о внешних компонентах.
Еще один подход, который следует рассмотреть, - это создавать ваши тесты в библиотеках DLL и использовать LoadLibrary () для явного их запуска. Если вы используете MfcUi :: TestRunner, вы могли бы создать небольшой выпадающий графический интерфейс, который позволит вам выбрать библиотеку для загрузки, загрузить ее, затем отобразить тесты для запуска в этой библиотеке, а затем запустить их.