gpt4 book ai didi

java - Spring Security @WithMockUser 不适用于 cucumber 测试

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:24:38 27 4
gpt4 key购买 nike

我正在使用 Cucumber 测试来测试启用了 Spring Security 的 Spring Boot 应用程序。一切正常,除非我使用 Cucumber 测试运行我的测试套件,一些使用 Spring Security 的测试,例如。

    @WithMockUser(username = "BROWSER", roles =
{"BROWSER","ADMIN"})

失败。如果我将它们作为简单的 junit 测试单独运行,这些测试确实有效,但在使用 Cucumber 测试步骤运行时失败。当我对 Cucumber 测试运行相同的行为时,问题看起来像是 spring 安全测试模拟行为没有得到应用。

我的 cucumber 测试运行类如下

@RunWith(Cucumber.class)
@CucumberOptions(features = "src/test/resources", monochrome = true, format =
{"pretty", "html:src/main/resources/static/cucumber"})
public class CucumberTests
{

}

我还注意到通过 Maven 使用 <reuseForks>false</reuseForks> 运行时同样有效.此外,如果未选中此选项,maven 触发的测试用例运行也会失败。

更新

AbstractIntegrationTest 类所有测试扩展

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Services.class,loader = SpringApplicationContextLoader.class)
//@IntegrationTest
@WebIntegrationTest(randomPort = true)
public abstract class AbstractIntegrationTest {

另一个不起作用的用例是使用这些注释是 cucumber 特征条件,如下所示

@When("^I apply a GET on (.*)$")
@WithMockUser(username = "BROWSER", roles = { "BROWSER", "ADMIN" })
public void i_search_with_rsql(String query) throws Throwable {
result = mvc.perform(get(uri, query));
}

关于此的任何帮助或解决方法。

最佳答案

WithMockUser 不适用于 Cucumber。请改用 cucumber 钩。

WithMockUser 依赖于来自 Spring 测试上下文支持的 TestExecutionListener#beforeTestMethod,但在使用 Cucumber runner 运行时不会调用它们。这是因为 Cucumber 运行由步骤组成的场景,而不是标准的 JUnit 测试方法。

选项 1 - 安全上下文 Hook 。您可以使用 Hook 设置安全上下文,例如:

@ActiveProfiles("test")
@SpringBootTest(classes = MyServer.class)
@AutoConfigureMockMvc
@AutoConfigureRestDocs
@AutoConfigureCache
public class MyServerContextHooks {

@Before
public void onBeforeScenario(final Scenario scenario) {
// This method does nothing - context setup is done with annotations
}
}

场景注释示例:

@WithAdminUser
Scenario: Run action as admin
...

在场景中使用注释的示例钩子(Hook):

public class TestUserHooks {

@Before("@WithAdminUser")
public void setupAdminUser() {
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(
"admin",
"N/A",
createAuthorityList("admin")));
}
}

选项 2 - 身份验证步骤。另一种方法是使用特殊步骤将用户提供给 mockMvc:

Scenario: Run action as admin
Given I am logged in as admin
...

Stepdef 示例:

public class SecurityTestSteps {

@Autowired
private MockMvcGlue mockMvc;

@Autowired
private OAuth2Mocks oauth2Mocks;

@Autowired
private TestUsers users;

/**
* Provides a one of predefined role-based authentications for the current request.
*/
@Given("^I am logged in as (admin|editor|user)$")
public void given_UserIsAuthenticatedWithRole(final String role) {
switch (role) {
case "admin":
mockMvc.request().with(authentication(oauth2Mocks.auth(users.admin())));
break;
case "editor":
mockMvc.request().with(authentication(oauth2Mocks.auth(users.edtior())));
break;
default:
throw new CucumberException("Unsupported role <" + role + ">");
}
}
}

关于java - Spring Security @WithMockUser 不适用于 cucumber 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36584184/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com