如何使用WireMockServer测试@RequestScope组件?获取错误“java.lang.IllegalStateException:找不到线程绑定的请求...”

时间:2018-04-30 05:32:40

标签: java spring spring-boot spring-test wiremock

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

0 个答案:

没有答案