测试 spring 应用程序时不支持 405 请求方法 'POST'
405 Request method 'POST' not supported when testing spring application
我准备并扩展了这个 existing spring example 运行 很好。您可以简单地使用 "user" 和 "password" 登录,然后您将被转发到 user/index.
使用这个控制器
@Controller
public class LoginController {
@GetMapping("/login")
public String login() {
return "login";
}
@GetMapping("/login-error")
public String loginError(Model model) {
model.addAttribute("loginError", true);
return "login";
}
}
但是一旦我 运行 使用 WebClient 的示例测试,相同的登录就会导致异常:
com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException: 405 Request method 'POST' not supported for http://localhost:8080/login
这很奇怪,因为应用程序本身运行良好。
编辑:这是导致问题的测试方法
@And("^the user clicks the login button$")
public void theUserClicksTheLoginButton() throws IOException {
page = page.getElementById("login").click();
}
没想到WebClient的点击方法是使用POST而不是真正执行html中的输入框。
<form th:action="@{/login}" method="post">
<label for="username">Username</label>:
<input type="text" id="username" name="username" autofocus="autofocus" /> <br />
<label for="password">Password</label>:
<input type="password" id="password" name="password" /> <br />
<input type="submit" id="login" value="Log in" />
</form>
编辑 2:
好的,也许我应该澄清一下我的问题。
我知道应该在 POST 上完成登录,而我的 @Controller
只提供 @GetMapping
但这没关系,因为 spring 安全正在处理 POST 请求,因为我登录时可以在 header 中看到:
我的问题是 为什么它在 运行 运行应用程序时运行良好,并且 为什么它在使用 WebClient 时表现不同.
Web 客户端正在通过 POST
请求调用服务,这导致异常:Request method 'POST' not supported
。服务端看起来不错。
我不太熟悉用 Cucumber 设置 Spring,我不确定在同一个设置中混合使用 SpringRunner
和 Cucumber
跑步者。
我已经像这样更新了您的测试设置:
@RunWith(SpringRunner.class)
@WebMvcTest
@ContextConfiguration
@Import(SecurityConfig.class)
public class LoginFeatureStepDefinition {
private String username;
private String password;
private HtmlPage page;
@Autowired
private WebClient webDriver;
- 我已将
@SpringBootTest
替换为 @WebMvcTest
,因为 mockmvc 自动配置将为您处理 webclient 设置。如果你想用整个应用程序启动一个实际的服务器并用 HTTP 客户端测试它,你需要设置 @SpringBootTest
in a different way.
- 在MockMvc设置中,默认不导入安全配置,所以需要导入
我准备并扩展了这个 existing spring example 运行 很好。您可以简单地使用 "user" 和 "password" 登录,然后您将被转发到 user/index.
使用这个控制器
@Controller
public class LoginController {
@GetMapping("/login")
public String login() {
return "login";
}
@GetMapping("/login-error")
public String loginError(Model model) {
model.addAttribute("loginError", true);
return "login";
}
}
但是一旦我 运行 使用 WebClient 的示例测试,相同的登录就会导致异常:
com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException: 405 Request method 'POST' not supported for http://localhost:8080/login
这很奇怪,因为应用程序本身运行良好。
编辑:这是导致问题的测试方法
@And("^the user clicks the login button$")
public void theUserClicksTheLoginButton() throws IOException {
page = page.getElementById("login").click();
}
没想到WebClient的点击方法是使用POST而不是真正执行html中的输入框。
<form th:action="@{/login}" method="post">
<label for="username">Username</label>:
<input type="text" id="username" name="username" autofocus="autofocus" /> <br />
<label for="password">Password</label>:
<input type="password" id="password" name="password" /> <br />
<input type="submit" id="login" value="Log in" />
</form>
编辑 2:
好的,也许我应该澄清一下我的问题。
我知道应该在 POST 上完成登录,而我的 @Controller
只提供 @GetMapping
但这没关系,因为 spring 安全正在处理 POST 请求,因为我登录时可以在 header 中看到:
我的问题是 为什么它在 运行 运行应用程序时运行良好,并且 为什么它在使用 WebClient 时表现不同.
Web 客户端正在通过 POST
请求调用服务,这导致异常:Request method 'POST' not supported
。服务端看起来不错。
我不太熟悉用 Cucumber 设置 Spring,我不确定在同一个设置中混合使用 SpringRunner
和 Cucumber
跑步者。
我已经像这样更新了您的测试设置:
@RunWith(SpringRunner.class)
@WebMvcTest
@ContextConfiguration
@Import(SecurityConfig.class)
public class LoginFeatureStepDefinition {
private String username;
private String password;
private HtmlPage page;
@Autowired
private WebClient webDriver;
- 我已将
@SpringBootTest
替换为@WebMvcTest
,因为 mockmvc 自动配置将为您处理 webclient 设置。如果你想用整个应用程序启动一个实际的服务器并用 HTTP 客户端测试它,你需要设置@SpringBootTest
in a different way. - 在MockMvc设置中,默认不导入安全配置,所以需要导入