Как заглушить кластерный шардинг для тестирования HTTP-маршрутов Akka

При попытке настроить проверку маршрутов для шардинг-кластера в Akka я всегда получаю сообщение «system» равно нулю:

Cannot invoke "akka.actor.ClassicActorSystemProvider.classicSystem()" because "system" is null

Вот мой тест, основанный на образцах akka :

public class WeatherRoutesTest extends JUnitRouteTest {

    private static final String configuration = """
            akka.actor.provider = cluster
            killrweather.routes.ask-timeout = 60s
            """;
    private static final ActorTestKit testKit = ActorTestKit.create(ConfigFactory.parseString(configuration));
    private TestRoute weatherRoute;

    @BeforeEach
    public void setup() {
        WeatherRoutes weatherRoutes = new WeatherRoutes(testKit.system());
        weatherRoute = testRoute(weatherRoutes.weather());
    }

    @AfterAll
    public static void tearDown() {
        testKit.shutdownTestKit();
    }

    @Test
    public void testWeather() {
        weatherRoute.run(HttpRequest.GET("/weather/62?type=temperature&function=average"))
                .assertStatusCode(StatusCodes.OK());
    }

}

Я попробовал все предложения, которые смог найти, но безуспешно. Образцы также не включают тест на этот случай. Может кто-нибудь помочь мне понять, как заглушить ClusterSharding? Помогите, подсказки приветствуются!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы создать модульный тест только для маршрутов, я бы изменил класс WeatherRoutes, чтобы он не искал само сегментирование, а взял фабрику ref ref в качестве параметра конструктора и использовал TestEntityRef в тестах, альтернативно кодируя взаимодействие с сущностью/ сегментирование в методах, которые можно переопределить в тестовой версии WeatherRoutes, чтобы напрямую возвращать результаты, подходящие для каждого теста, вместо фактического взаимодействия с сегментированием.

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

Мне не совсем понятно, где будет система актеров null из того, что вы поделились, но если вы хотите пройти путь интеграционного тестирования, вам нужно сначала это выяснить.

если вы не возражаете, я задам дополнительный вопрос, что вы имели в виду под entity ref factory? Я просмотрел пакет шардинга, но не смог его найти. Как маршруты могут получить доступ к ссылкам на сущности без объекта сегментирования? Спасибо!

Yanire Romero 26.04.2024 23:48

Обычно вы используете фабричный метод sharding.entityRefFor для создания ссылки на объект, которому вы хотите отправлять сообщения. Это может выглядеть как поиск, но ссылки на сущности очень легкие и фактически создаются каждый раз, когда вы их вызываете.

johanandren 28.04.2024 12:42

Другие вопросы по теме