При попытке настроить проверку маршрутов для шардинг-кластера в 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? Помогите, подсказки приветствуются!
Чтобы создать модульный тест только для маршрутов, я бы изменил класс WeatherRoutes
, чтобы он не искал само сегментирование, а взял фабрику ref ref в качестве параметра конструктора и использовал TestEntityRef в тестах, альтернативно кодируя взаимодействие с сущностью/ сегментирование в методах, которые можно переопределить в тестовой версии WeatherRoutes
, чтобы напрямую возвращать результаты, подходящие для каждого теста, вместо фактического взаимодействия с сегментированием.
Также возможно провести более комплексный интеграционный тест, но тогда вам придется фактически сформировать в тесте кластер из одного узла, а затем использовать сегментирование, как обычно. Из-за настройки кластера такой тест будет немного медленнее и будет содержать больше частей, которые могут пойти не так.
Мне не совсем понятно, где будет система актеров null
из того, что вы поделились, но если вы хотите пройти путь интеграционного тестирования, вам нужно сначала это выяснить.
Обычно вы используете фабричный метод sharding.entityRefFor для создания ссылки на объект, которому вы хотите отправлять сообщения. Это может выглядеть как поиск, но ссылки на сущности очень легкие и фактически создаются каждый раз, когда вы их вызываете.
если вы не возражаете, я задам дополнительный вопрос, что вы имели в виду под
entity ref factory
? Я просмотрел пакет шардинга, но не смог его найти. Как маршруты могут получить доступ к ссылкам на сущности без объекта сегментирования? Спасибо!