У меня есть аннотация в классе, например
public class ProductModel {
@Pattern(regexp = "^(1|[1-9][0-9]*)$", message = "Quantity it should be number and greater than zero")
private String quantity;
затем в моем контроллере
@Controller
public class Product Controller
private ProductService productService;
@PostMapping("/admin/product")
public String createProduct(@Valid @ModelAttribute("product") ProductModel productModel, BindingResult result)
{
// add println for see the errors
System.out.println("binding result: " + result);
if (!result.hasErrors()) {
productService.createProduct(productModel);
return "redirect:/admin/products";
} else {
return "product";
}
}
Затем я пытаюсь протестировать createProduct из ProductController.
@RunWith(MockitoJUnitRunner.class)
public class ProductControllerTest {
@Autowired
private MockMvc mockMvc;
@Mock
ProductService productService;
@InjectMocks
ProductController productController;
@Mock
private BindingResult mockBindingResult;
@Before
public void setupTest() {
MockitoAnnotations.initMocks(this);
Mockito.when(mockBindingResult.hasErrors()).thenReturn(false);
}
@Test
public void createProduct() throws Exception {
productController = new ProductController(productService);
productController.createProduct(new ProductModel(), mockBindingResult);
Здесь я не знаю, как я могу добавить значения в модель продукта объекта, а также как я могу проверить вывод сообщения «... число должно быть больше нуля». То, что я пытался сделать, это создать объект, а затем утвердить значения, чтобы он не работал или работал, например assertEquals (привет, objectCreated.getName()); Любые советы или помощь будут высоко оценены.
Просто используйте установщик вашей модели
ProductModel productModel = new ProductModel();
productModel.setQuantity("a crazy String");
productModel.setAnotherValueOfThatModel(true);
productController.createProduct(new ProductModel(), mockBindingResult);
Чтобы проверить аннотации bean-компонента, вы должны иметь исполняемый контекст. Вы можете сделать это с помощью:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
Затем ваши тесты будут проверять аннотации.
Однако, если вы просто хотите проверить аннотацию модели (без других бизнес-правил), вы можете использовать валидатор:
private static ValidatorFactory validatorFactory;
private static Validator validator;
@BeforeClass
public static void createValidator() {
validatorFactory = Validation.buildDefaultValidatorFactory();
validator = validatorFactory.getValidator();
}
@AfterClass
public static void close() {
validatorFactory.close();
}
@Test
public void shouldReturnViolation() {
ProductModel productModel = new ProductModel();
productModel.setQuantity("a crazy String");
Set<ConstraintViolation<ProductModel>> violations = validator.validate(productModel);
assertFalse(violations.isEmpty());
}
Привет, Аллан, да, я понимаю, что мне нужно сделать ИТ, чтобы проверить, работают ли мои аннотации или нет. Спасибо за вашу помощь!