Как проверить компонент с областью websocket? - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь создать простой тест для простого компонента, помеченного областью веб-сокета. Проблема в том, что я получаю эту ошибку:

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);
    }


}

1 Ответ

0 голосов
/ 26 апреля 2019

Попробуйте шпионить за сервисом trackerService с помощью следующего кода внутри класса тестирования:

@SpyBean
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 = Mockito.verify(trackerService).isBeingTracked("ABC1234");
    Assert.assertTrue(result);
}

Обновленный ответ:

@MockBean
private TrackerService trackerService;

@Test
public void startTracking() {

    Mockito.doAnswer((Answer<Object>) invocationOnMock -> {
        Object[] args = invocationOnMock.getArguments();
        assertEquals("ABC1234", invocationOnMock.getArgument(0));
        return null;

    }).when(sessionTracker).sessionDestroyed(Mockito.any());

    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);
}
...