當運行/調試單元測試時,我非常驚訝地發現IntelliJ實際上是運行時在IDEA中驗證了@NotNull。我可以將這個相同的功能添加到我的Maven構建中嗎? (做什麼瓶/ JVM設置我需要?)如何添加@NotNull批註的運行時處理
9
A
回答
0
我會去的AOP方式:
首先你需要一個javax.validation兼容驗證(Hibernate Validator是參考實現)。
現在創建一個具有Validator實例並檢查所有方法參數以驗證錯誤的aspectj方面。這裏是一個快速的版本,讓你開始:
public aspect ValidationAspect {
private final Validator validator;
{
final ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
}
pointcut serviceMethod() : execution(public * com.yourcompany**.*(..));
before() : serviceMethod(){
final Method method = (Method) thisJoinPoint.getTarget();
for(final Object arg : thisJoinPoint.getArgs()){
if(arg!=null) validateArg(arg,method);
}
}
private void validateArg(final Object arg, final Method method) {
final Set<ConstraintViolation<Object>> validationErrors = validator.validate(arg);
if(!validationErrors.isEmpty()){
final StringBuilder sb = new StringBuilder();
sb.append("Validation Errors in method ").append(method).append(":\n");
for (final ConstraintViolation<Object> constraintViolation : validationErrors) {
sb.append(" - ").append(constraintViolation.getMessage()).append("\n");
}
throw new RuntimeException(sb.toString());
}
}
}
使用aspectj-maven-plugin編織這方面到您的測試和/或產品代碼。
如果您只想要測試此功能,則可以將aspectj-plugin執行放入配置文件中。
4
IDEA正在使用自己的方法來測試字節碼以添加這樣的驗證。對於命令行構建,我們提供執行插裝的javac2 Ant任務(擴展標準的javac任務)。如果您從IDEA生成Ant構建,則可以選擇使用javac2。
We don't provide similar Maven plug-in yet,但there is third-party version它可能適合你(雖然,它似乎有點舊)。
0
您可以在JUnit測試中進行註釋驗證。
import java.util.Set;
import javax.validation.ConstraintViolation;
import junit.framework.Assert;
import org.hibernate.validator.HibernateValidator;
import org.junit.Before;
import org.junit.Test;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
public class Temp {
private LocalValidatorFactoryBean localValidatorFactory;
@Before
public void setup() {
localValidatorFactory = new LocalValidatorFactoryBean();
localValidatorFactory.setProviderClass(HibernateValidator.class);
localValidatorFactory.afterPropertiesSet();
}
@Test
public void testLongNameWithInvalidCharCausesValidationError() {
final ProductModel productModel = new ProductModel();
productModel.setLongName("A long name with\t a Tab character");
Set<ConstraintViolation<ProductModel>> constraintViolations = localValidatorFactory.validate(productModel);
Assert.assertTrue("Expected validation error not found", constraintViolations.size() == 1);
}
}
如果你的毒藥是春天,一起來看看這些Spring Unit Tests
相關問題
- 1. 如何將運行時參數添加到批處理文件?
- 2. 如何運行批處理?
- 3. 如何運行批處理批
- 4. LibGDX Sprite批處理並在運行時添加新的精靈
- 5. 如何從批處理腳本中運行批處理腳本?
- 6. 如何添加批註的目錄到可運行的jar
- 7. 註銷時在Windows服務中運行批處理文件
- 8. 登錄時運行批處理文件
- 9. 用imagemagick運行批處理
- 10. 運行批處理文件
- 11. 運行批處理文件
- 12. 運行批處理文件
- 13. 運行批處理文件
- 14. 如何在運行時添加通用事件處理程序
- 15. 如何將%random%添加到批處理文件的新批處理文件中?
- 16. 如何將批處理請求處理添加到Django項目?
- 17. 批處理文件作爲管理註冊表項運行?
- 18. 在Eclipse中,如何添加工具欄按鈕來運行批處理文件?
- 19. 如何在運行時在頂部啓動批處理文件?
- 20. 如何運行批處理腳本2小時
- 21. 如何在運行批處理文件時設置變量
- 22. 運行批處理文件時如何不打開Cmd窗口
- 23. 批處理 - 如何在同一時間運行兩個命令?
- 24. 如何在運行批處理文件時隱藏cmd窗口?
- 25. 如何在批處理腳本中運行powershell腳本和批處理腳本?
- 26. 如何在tensorflow中運行Iteration.get_next()後獲得批處理批處理?
- 27. 如何使用@Target處理批註(ElementType.TYPE_USE)?
- 28. 批次如何安排備份添加到批處理文件
- 29. 從另一個批處理文件運行批處理文件
- 30. 在批處理文件中運行批處理腳本
是javac2.jar對的tools.jar更換? – krosenvold
不,它只是一個通過添加GUI表單和註釋工具來擴展Ant javac任務的Ant任務。 IDEA Community Edition git存儲庫中提供了此任務的源代碼。 – CrazyCoder
@CrazyCoder在我想測試空指針行爲的地方,是否有辦法關閉單元測試的處理? IE瀏覽器。 '@ org.junit.Test(expected = NullPointerException.class)'tests? – Martin