Я пытаюсь создать простой тест для простого компонента, помеченного областью веб-сокета. Проблема в том, что я получаю эту ошибку:
Scope 'websocket' is not active for the current thread;
Что имеет смысл, поскольку я использую симулированный клиент WebSocket для выполнения входа в систему, а в контексте на стороне клиента приложения Spring сеанс websocket, созданный клиентом, не оказывает влияния.
Как правильно тестировать компоненты области веб-сокета?
Класс компонентов:
@Service
@Scope(scopeName = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class TrackerService {
private final ConcurrentMap<String, Collection<Geolocation>> vehicleBeingTracked = new ConcurrentHashMap<>();
public void startTracking(String plateSequence) {
vehiclesBeingTracked.put(plateSequence, new ArrayList<>());
}
public void stopTracking(String plateSequence) {
vehiclesBeingTracked.remove(plateSequence);
}
public void spotVehicle(String plateSequence, Geolocation geo) {
vehiclesBeingTracked.get(plateSequence).add(geo);
}
public boolean isBeingTracked(String plateSequence) {
return vehiclesBeingTracked.containsKey(plateSequence);
}
}
Класс контроллера:
@Controller
@MessageMapping("/operational/tracker")
public class TrackerController {
@Autowired
private TrackerService trackerService;
@MessageMapping("/plate/{plateSequence}/track.start")
public void startTracking(@DestinationVariable("plateSequence") String plateSequence) {
trackerService.startTracking(plateSequence);
}
}
Тестовый класс:
@RunWith(SpringRunner.class)
@ContextConfiguration
@SpringBootTest(classes = UnifyApplication.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@ActiveProfiles("test")
public class TrackerTest {
@Autowired
private TrackerService trackerService;
@Test
public void startTracking() {
TrackerClient client = new TrackerClient("ws://localhost:9050/operational/websocket", "admin", "admin");
client.connectAndWait();
client.send("/operational/tracker/plate/ABC1234/track.start");
TimeUnit.SECONDS.sleep(1);
boolean result = trackerService.isBeingTracked("ABC1234"); // Here is the error
Assert.assertTrue(result);
}
}