1

我有一个@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" ) );
    }
}
4

0 回答 0