Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JUnit5测试自定义约束注释_Java_Junit5 - Fatal编程技术网

Java 使用JUnit5测试自定义约束注释

Java 使用JUnit5测试自定义约束注释,java,junit5,Java,Junit5,实现自定义约束注释,如@MySize,需要我使用单元测试来测试它是否正常工作: public class MySizeTest { @Test public void noMinMax() { Dummy dummy = new Dummy(); // some asserts or so dummy.setMyField(""); dummy.setMyField(null); dummy.setMyField(

实现自定义约束注释,如
@MySize
,需要我使用单元测试来测试它是否正常工作:

public class MySizeTest {
   @Test
   public void noMinMax() {
       Dummy dummy = new Dummy();
       // some asserts or so
       dummy.setMyField("");
       dummy.setMyField(null);
       dummy.setMyField("My text");
   }

   @Test
   public void onlyMin() {
       // change @MySize to have min: @MySize(min = 1)
       ... how?
       ... then test with some setMyField:
       Dummy dummy = new Dummy();
       // some asserts or so
       dummy.setMyField("");
       dummy.setMyField(null);
       dummy.setMyField("My text");
   }

   @Test
   public void onlyMax() {
       // change @MySize to have max: @MySize(max = 50)
       ...
   }

   @Test
   public void bothMinMax() {
       // change @MySize to have min and max: @MySize(min = 1, max = 50)
       ...
   }

   private class Dummy {
       @MySize()
       String myField;

       public String getMyField() {
           return myField;
       }

       public void setMyField(String myField) {
           this.myField = myField;
       }
    }
}

我认为这必须通过反思来完成,但我不知道如何实现

基本上不必使用反射,只需创建一个
验证器
实例并使用它进行验证

例如,枫叶:

当注释为:

@Target(ElementType.FIELD)
@保留(RetentionPolicy.RUNTIME)
@约束(validatedBy=MyValidator.class)
public@interface-MyAnnotation{
字符串消息()默认为“无效值(必须是foo)”;
类[]组()默认值{};

类基本上不必使用反射,只需创建一个
验证器
实例并使用它进行验证

例如,枫叶:

当注释为:

@Target(ElementType.FIELD)
@保留(RetentionPolicy.RUNTIME)
@约束(validatedBy=MyValidator.class)
public@interface-MyAnnotation{
字符串消息()默认为“无效值(必须是foo)”;
类[]组()默认值{};


CLASS您的问题到底是什么?您是否对注释是否按预期保存指定的值感兴趣,或者在实际约束验证时测试是关于什么的?测试@MySize的使用情况。它可以以4种不同的方式使用:@MySize(),@MySize(min=),@MySize(max=),@MySize(min=,max=)。我不想在测试类中创建4个字段来测试它。@neblaz您能解释一下为什么不创建4个字段吗?验证器可以单独验证它。目前@MySize有2个属性(最小、最大),可以扩展为3或4个属性,意味着8或16个组合,因此在一个测试类中硬编码8或16个不同的测试字段。最好有一个带注释的字段,让适当的测试方法修改它。这是一个很难找到的解决方案吗?我认为使用反射是一种方法,但我从未使用过它。@neblaz你真的应该这样做吗考虑引入单独的字段!它是否感觉枯燥、无创造性、可能有点愚蠢?恭喜,现在它是正确的测试代码;-)你的问题到底是什么?你是否对你的注释保持了预期的指定值还是在实际的约束验证中进行测试感兴趣?测试@ Mysiz的用法。e、 它可以用4种不同的方式使用:@MySize()、@MySize(min=)、@MySize(max=)、@MySize(min=,max=)。我不想在测试类中创建4个字段来测试它。@neblaz你能解释为什么不想创建4个字段吗?验证器可以单独验证它。目前@MySize有2个属性(min,max),可以扩展为3或4个属性,意味着8或16个组合,因此在一个测试类中硬编码8或16个不同的测试字段。最好有一个带注释的字段,让适当的测试方法修改它。这是一个很难找到的解决方案吗?我认为使用反射是一种方法,但我从未使用过它。@neblaz你真的应该这样做吗考虑引入单独的字段!它是否觉得枯燥、无创意、也许有点愚蠢?恭喜,现在它是正确的测试代码;-不要认为这回答了我的问题。请看下面我的问题。我想测试@ Mysiz的用法。它有Min和Max,就像@ siz。谢谢你的回答和努力,还得通过。h它并理解它。在这里,我找到了指向我所想方向的东西:尽管它在类上有注释,并且注释在示例中只有一个方法(greet()。@zforgo在@Override中是有效的(..),您使用的是结构return的return语句((条件1)和(&&)(条件2))“&”是快速中断的-这意味着如果条件1的计算结果为false,则条件2将不再计算。如果冲突1和2不是互斥的,则在计算时可能只需要使用单个“&”。这样,生成的ConstraintViolation集将包含两个条件的验证错误信息。这如果您有更复杂的条件并将检查排除在多个函数调用中,则变得更为重要。不要认为这回答了我的问题。请参阅我问题下方的评论。我想测试@MySize的用法。它有min和max,就像@Size。感谢您的回答和努力,仍然需要完成并理解它。这里是什么我找到了我所想的方向:虽然它在类上有注释,并且注释在示例中只有一个方法(greet()。@zforgo在@Override isValid(..)中使用结构return的return语句((条件1)和&(条件2))“&”是快速中断的-这意味着如果条件1的计算结果为false,则条件2将不再计算。如果冲突1和2不是互斥的,则在计算时可能只需要使用单个“&”。这样,生成的ConstraintViolation集将包含两个条件的验证错误信息。这如果您有更复杂的条件并将检查排除在多个函数调用中,则变得更加重要。