У меня есть компонент @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" ) );
}
}