Как протестировать компонент @RequestScope с WireMockServer? Получает ошибку "java.lang.IllegalStateException: не найден связанный с потоком запрос ..." - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть компонент @RequestScope, и я пытаюсь протестировать его с сервером Mock Wire, но он выдает исключение:

java.lang.IllegalStateException: не найден привязанный к потоку запрос: Вы ссылаетесь на атрибуты запроса вне фактического веб-запроса или обрабатываете запрос вне первоначально принимающего потока? Если вы действительно работаете в веб-запросе и по-прежнему получаете это сообщение, ваш код, вероятно, выполняется за пределами DispatcherServlet / DispatcherPortlet: в этом случае используйте RequestContextListener или RequestContextFilter для предоставления текущего запроса.

Класс:

@Component
@RequestScope
public class MyData
{
    private static final Logger LOGGER = LoggerFactory.getLogger( MyData.class );

    @Autowired
    private MyData MyData;

    public MyData()
    {
    }

    //...elided...
}

И тест:

@RunWith( SpringJUnit4ClassRunner.class )
@SpringBootTest(
    webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
)
@ActiveProfiles( { "test-My-data" } )
@TestPropertySource(
    properties = {
        "BASE_URL_PROTOCOL=http",
        "BASE_URL=localhost"
    }
)
public class MyDataIntegrationTest
{
    @Value( "${BASE_URL_PROTOCOL}" )
    private String baseProtocol;

    @Value( "${BASE_URL}" )
    private String baseUrl;

    @Autowired
    Provider<MyData> MyData;

    private WireMockServer wireMockServer;

    @Before
    public void setUp()
    {
        // WireMock configuration.
        wireMockServer = new WireMockServer( options().dynamicPort() );
        wireMockServer.start();
    }

    @Test
    public void testMyData()
    {
        wireMockServer.stubFor(
            WireMock.get(
                urlEqualTo(
                    String.format(
                        "/my-svc/%s/data", "user1"
                    )
                )
            ).willReturn(
                aResponse().withBody(
                    "{\"department\": \"one\", " +
                    "\"position\": \"teacher\" }"
                ).withHeader( "Content-Type", "application/json" ) 
            )
        );

        String userName = MyData.get().getUserName( "user1" );

        wireMockServer.verify( 1, getRequestedFor( urlEqualTo( String.format( "/my-svc/%s/data", "user1" ) ) ) );

        assertThat( userName, equalTo( "Joe Doe" ) );
    }
}
...