1. "Свой сервис отправки СМС" есть только у операторов сотовой связи.
2. СМС есть маркетинговые и транзакционнные. Маркетинговые проходят через каку-то системму фильтров, а транзакционные нет. Первые используются для всякого спама, вторые - для всяких кодов от банков или 2fa, такси и всего такого, для чего важно время доставки сообщения. Маркетинговые могут отклонять, транзакционные нет, но если там будете хулиганить - вас отключат и все.
3. Цена вопрос индивидуальный.
1. Насчет совместимости - читайте QVL для вашей m/b. Нет такого понятия "хорошо работать вместе". Железо либо совместимо, либо нет.
2. 16Гб, действительно маловато, хотя все зависит от ваших задач. Кому-то и 8 хватает, а кому-то и 64 впритык.
Тут можно сэкономить немного. Взять для начала 2 по 8, а потом, если не будет хватать - уже думать об апгрейде.
3. Подойдет. Хватит на какое-то время.
В контроллере им самое место.
Есть такая поговорка: только API - вечно.
Никто никогда API не переписывает.
На крайний случай делают v2, v3 версии (было, например, /user, стало /v2/user).
Поэтому то, что оно захардкожено - это не плохо. Это так и должно быть.
1. Не нужно тестировать private методы, выковыривая их через рефлексию. Они для того и private чтобы скрыть реализацию.
2. Там где у вас написано //Code under test как раз должен быть "код, который вы тестируете. Т.е. там нужно вызвать метод, который предполагаемо выбросит эксепшен.
Вот тут еще можно глянуть пример: https://www.baeldung.com/junit-assert-exception#junit-5