给定以下类:
class Contact{
@Getter
@Setter
@Email
private String mail;
}
@RestController
class ContactController{
@PostMapping(path = "/contacts")
public ResponseEntity<Contact> addContact(
@Valid @RequestBody Contact contact) {
....
}
}
我如何在小 cucumber 场景中进行测试?
我尝试了以下方法:
Scenario Outline: validation failed use-case
Given I am authenticated as "<userFirstName>"
When I register a new contact "<contactJsonLocation>"
Then it should throw an ConstraintViolationException of contact
Examples:
| userFirstName | contactJsonLocation |
| Simon | contactWithMailNotWellFormatted.json |
步骤代码:
public CreateContactSteps(ContactController contactController) {
When("^I register a new contact \"([^\"]*)\"$",
(String contactJsonLocation) -> {
try {
Contact contact;
String jsonContact = Files.readString(Paths.get(new ClassPathResource("files/" + contactJsonLocation).getURI()));
contact = objectMapper.readValue(jsonContact, Contact.class);
String id = UUID.randomUUID().toString();
contact.setId(id);
createContactAttempt.setId(id);
createContactAttempt.setMail(contact.getMail());
contactController.addContact(contact);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (ConstraintViolationException e) {
createContactAttempt.lastException = e;
}
});
Then("^it should throw an ConstraintViolationException of contact$",
() -> {
Assertions.assertTrue(createContactAttempt.lastException instanceof ConstraintViolationException);
createContactAttempt.lastException = null;
});
型
当我在启动spring Boot 应用程序后测试创建新联系人时,验证部分一切正常,这意味着我收到了预期的400错误。但当我从测试上下文调用ContactController时,它无法验证,联系人被创建。我猜这与spring在幕后发挥了一些魔力有关。但是什么呢?现在我正在为自己创建这样的 cucumber 应用程序上下文(我可能做错了什么,我愿意接受建议/好的批评):
@RunWith(Cucumber.class)
@CucumberOptions(plugin = {"pretty", "html:FeaturesReport.html"},
features = {"src/test/resources/features"})
public class AllAcceptanceTest {
}
@CucumberContextConfiguration
@ContextConfiguration(classes = {BeanConfiguration.class})
public class ContextConfigurationTesting implements En {
}
@Configuration
@RequiredArgsConstructor
public class ControllerConfiguration {
@Bean
public ContactController contactController() {
return new ContactController(
... //every other bean the controller need
);
}
...
}
1条答案
按热度按时间1wnzp6jl1#
@Valid
注解signals the caller ofaddContact
that the object should be valid。直接调用addContact
可以绕过它。您可能需要考虑使用MockMvc
来调用控制器。我建议使用Sping Boot 来设置应用程序上下文。Spring Boot有一组丰富的特性,可以让您轻松地测试应用程序的许多方面。