当前位置: 首页 > 知识库问答 >
问题:

如何测试任何引发异常的方法调用?

皇甫通
2023-03-14

JUnit 4.12

public class StaticFieldsUtils {

    public static <T> T getPublicStaticFieldByName(String name, Class<T> clazz){
        for(Field f : clazz.getDeclaredFields()){
            if(Modifier.isStatic(f.getModifiers()) && 
                 Modifier.isPublic(f.getModifiers()) && 
                 f.getName().equals(name))
                try {
                    Object fieldValue = f.get(null); 
                    if(clazz.isAssignableFrom(fieldValue.getClass()))
                        return (T) fieldValue;
                } catch (IllegalAccessException e) { 
                    throw new IllegalArgumentException(String.format("Invalid access to the field %s", name));
                }
        }
        throw new IllegalArgumentException(String.format("A public field with the name %s does not exist in the class %s", name, clazz.getSimpleName()));
    }

    //Some other utility methods
}
public class StaticFieldsUtilsTest {

    private static class StaticFieldContainer{
        public static final StaticFieldContainer FIELD1 = new StaticFieldContainer();
        public static final StaticFieldContainer FIELD2 = new StaticFieldContainer();
        public static final StaticFieldContainer FIELD3 = new StaticFieldContainer();
        public static final StaticFieldContainer FIELD4 = new StaticFieldContainer();
        protected static final StaticFieldContainer FIELD5 = new StaticFieldContainer();
        static final StaticFieldContainer FIELD6 = new StaticFieldContainer();
        private static final StaticFieldContainer FIELD7 = new StaticFieldContainer();
        public static StaticFieldContainer FIELD8 = new StaticFieldContainer();
    }

    @Test(expected=IllegalArgumentException.class)
    public void testViolations(){
        StaticFieldContainer field = StaticFieldsUtils.getPublicStaticFieldByName("FIELD5", StaticFieldContainer.class); 
    }

    @Test(expected=IllegalArgumentException.class)
    public void testViolations2(){
        StaticFieldContainer field = StaticFieldsUtils.getPublicStaticFieldByName("FIELD6", StaticFieldContainer.class); 
    }
    //ETC
}

共有1个答案

殳越
2023-03-14

使用JUnit理论和ExpectedException规则:

@RunWith(Theories.class)
public class StaticFieldsUtilsTest {

  //your inner class with static fields


  @Rule
  public ExpectedException thrown = ExpectedException.none();

  @DataPoint
  public static String FIELD1 = "Field1";
  @DataPoint
  public static String FIELD2 = "Field2";

  @Theory
  public void testViolations(String field){
    thrown.expect(IllegalArgumentException.class);
    StaticFieldsUtils.getPublicStaticFieldByName(field, StaticFieldContainer.class); 
  }
}

如果您想用其他名称应用许多理论,我建议创建一个自定义注释和parametersuppliver

 类似资料:
  • 我有一个返回类型为的方法。它还可以抛出许多异常,所以我想测试一下那些被抛出的异常。所有尝试都失败了,原因相同: 类型Stubber中的(T)不适用于参数(void)时的方法 有什么想法,我可以如何获得方法抛出一个指定的异常?

  • 问题内容: 我有一个带有返回类型的方法。它还可以引发许多异常,因此我想测试所引发的异常。所有尝试均以相同的原因失败: Stubber类型中的when(T)方法不适用于参数(void) 有什么想法可以获取引发指定异常的方法吗? 问题答案: 括号放置不正确。 您需要使用: 而 不是 使用: 在文档中对此进行了解释

  • 我想使用测试异常是否工作良好。 例如,假设I test queue。

  • 问题内容: 有没有一种方法(在编码时)知道在执行python代码时期望哪些异常?由于不知道会抛出哪种异常类型(并且不要告诉我阅读文档,所以很多时候我都会捕获90%的基础Exception类)。很多时候,异常可以从深处传播出去。次文档未更新或不正确)。有某种工具可以检查吗?(例如通过阅读python代码和库)? 问题答案: 我猜一个解决方案可能只是不精确,因为缺少静态的输入规则。 我不知道有什么工具

  • 我有两个模块,一个从rest模板调用另一个。(管理员调用notifServer)notifServer有一个用Async注释的方法。我想在该方法中抛出一个异常,但管理员获取响应太快,并且无法在admin中捕获异常方法。 我是spring和@Async进程的新成员。我已经尝试将响应主体从NotifServer映射到C的CompletableFuture。类 。但我仍然没有得到错误响应。 此代码来自管

  • 考虑以下代码: 我想做的是,在异常测试中,标记我希望调用doSomething1()。然而,在转换器上抛出异常。convert(),这意味着永远不会调用verify()调用。因此,verifyNoMoreInteractions()在after()中失败。 注意:这是一个非常通用的示例,用于隐藏我们的任何内部代码。