我有一个@RequestScope
组件,我正在尝试使用有线模拟服务器测试它,但它会引发异常:
java.lang.IllegalStateException:找不到线程绑定请求:您是指实际Web请求之外的请求属性,还是处理最初接收线程之外的请求?如果您实际上是在Web请求中操作并仍然收到此消息,则您的代码可能在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" ) );
}
}