Вы действительно хотите, чтобы тест выполнял одну вещь и проверял ее. Если вы не уверены, какое именно исключение будет выдано, для меня это не будет хорошим испытанием.
например. (в псевдокоде)
try {
badOperation();
/// looks like we succeeded. Not good! Fail the test
fail();
}
catch (ExpectedException e) {
// that's fine
}
catch (UnexpectedException e) {
// that's NOT fine. Fail the test
}
, поэтому, если вы хотите проверить, что ваш метод выдает 2 разных исключения (для 2 наборов входных данных), вам понадобится 2 теста.
Резюме: -символика предотвращает взаимное наложение функций внутри совместно используемых объектов
Связывание с совместно используемыми объектами позволяет использовать функцию, называемую взаимным расположением символов. Идея состоит в том, что вы можете «вставить» новое определение глобального символа так, чтобы оно называлось, а не «обычное» определение.
Одним из классических примеров является malloc (). Чаще всего malloc () определяется в libc. Но вы можете вставить свою собственную версию malloc, загрузив библиотеку, которая определяет этот символ, перед загрузкой libc (большинство компоновщиков времени выполнения позволяют вам использовать LD_PRELOAD для определенных библиотек для загрузки перед исполняемым файлом).
По умолчанию, любая функция в пределах общий объект, который не является статическим, является глобальным символом. Из-за этого можно вставлять любые функции в общем объекте. Рассмотрим сценарий, в котором общий объект имеет функцию high_level () и low_level (), а high_level () вызывает low_level () как часть своей реализации, и ни high_level (), ни low_level () не являются статическими функциями.
Можно вставить low_level () таким образом, чтобы high_level () вызывала low_level () из другого разделяемого объекта.
Здесь на помощь приходит -symbolic. При создании вашего общего объекта компоновщик увидит, что low_level () определяется в том же общем объекте, что и high_level (), и связывает вызов таким образом, чтобы его нельзя было вставить. Таким образом, вы знаете, что любые вызовы одной функции в вашем общем объекте к другой в том же общем объекте никогда не будут вставлены.
s, и ни high_level (), ни low_level () не являются статическими функциями.Можно вставить low_level () таким образом, чтобы high_level () вызывала low_level () из другого разделяемого объекта.
Здесь на помощь приходит -symbolic. При создании вашего общего объекта компоновщик увидит, что low_level () определяется в том же общем объекте, что и high_level (), и связывает вызов таким образом, чтобы его нельзя было вставить. Таким образом, вы знаете, что любые вызовы одной функции в вашем общем объекте к другой в том же общем объекте никогда не будут вставлены.
s, и ни high_level (), ни low_level () не являются статическими функциями.Можно вставить low_level () таким образом, чтобы high_level () вызывала low_level () из другого разделяемого объекта.
Здесь на помощь приходит -symbolic. При создании вашего общего объекта компоновщик увидит, что low_level () определяется в том же общем объекте, что и high_level (), и связывает вызов таким образом, чтобы его нельзя было вставить. Таким образом, вы знаете, что любые вызовы одной функции в вашем общем объекте к другой в том же общем объекте никогда не будут вставлены.
компоновщик увидит, что low_level () определен в том же общем объекте, что и high_level (), и свяжет вызов так, чтобы его нельзя было вставить. Таким образом, вы знаете, что любые вызовы одной функции в вашем общем объекте к другой в том же общем объекте никогда не будут вставлены. компоновщик увидит, что low_level () определен в том же общем объекте, что и high_level (), и свяжет вызов так, чтобы его нельзя было вставить. Таким образом, вы знаете, что любые вызовы одной функции в вашем общем объекте к другой в том же общем объекте никогда не будут вставлены.