Я использую Play для микросервисов в многопроектной настройке SBT. Моя идея состояла в том, чтобы создать отдельный модуль исключительно для функционального тестирования, который будет depend
во всех приложениях Play и запускать экземпляры Play's TestServer
, и сервисы будут взаимодействовать через вызов своих конечных точек REST. Это, похоже, не работает, потому что, хотя экземпляры TestServer
создаются в их ретроспективных модулях, оба экземпляра указывают на приложение одного типа. Чтобы проиллюстрировать это:
Итак, у вас есть мультипроект SBT. 2 модуля являются приложениями Play, а третий предназначен для запуска функциональных тестов с обоими приложениями.
sbt_multi_project/
└── app_one/
└── test/
└── FakeAppOneServer.java
└── app_two/
└── test/
└── FakeAppTwoServer.java
└── func_test_module/
└── test/
└── RunTests.java
Например, эти поддельные серверы реализованы следующим образом:
public class FakeAppOneServer {
public static TestServer INSTANCE = new TestServer(9001, fakeApplication());
}
func_test_module
зависит от 2 приложений. В build.sbt
:
lazy val `func_test_module` = (project in file("func_test_module"))
.settings(
// ...
)
.dependsOn(
`app_one` % "test->test",
`app_two` % "test->test"
)
И в RunTests.java
вы работаете с такими подделками, например:
@Test
public void someTests() {
FakeAppOneServer.INSTANCE.doYourThing();
FakeAppTwoServer.INSTANCE.doAnotherThing();
}
Проблема в том, что оба FakeAppOneServer
& FakeAppTwoServer
указать на то же приложение. Это разные экземпляры, работающие на разных портах, но это одна и та же реализация, т. Е. Вызов /
на обоих приведет к экземпляру AppOne
, например.
Спасибо за любые предложения!