如果抛出异常,则Assert.notThrown可以指定消息

时间:2016-06-29 12:45:26

标签: java spring assert assertions

我在我的项目中使用Spring Asserts并希望使用它们(或者可能是其他一些Asserts)来检查在某些情况下是否抛出异常,例如我有以下代码:

//throws PatternSyntaxException in case if pattern is invalid

Pattern.compile(freeUsersRegex);
Pattern.compile(deletedUsersRegex);
Pattern.compile(movedUsersReges);
...

如果正则表达式无效(每次不同),我想指定一条消息,以向用户显示哪一个正则表达式无效,类似:

    try {
        Pattern.compile(freeUsersRegex);
    } catch (PatternSyntaxException e ) {
        throw new IllegalArgumentException("Specify valid regular expression for Free users group");
    }

    try {
        Pattern.compile(deletedUsersRegex);
    } catch (PatternSyntaxException e ) {
        throw new IllegalArgumentException("Specify valid regular expression for Deleted users group");
    }
    ...

但是为每个字符串编写try / catch都不是很方便,用上面的代码替换上面的代码会很酷:

Assert.isNotThrown(Pattern.compile(freeUsersRegex), PatternSyntaxException.class, "Specify valid regular expression for Free users group");

Assert.isNotThrown(Pattern.compile(deletedUsersRegex), PatternSyntaxException.class, "Specify valid regular expression for Deleted users group");

我在Spring中寻找过这样的Assert而无法找到它。也许在其他图书馆里有类似的东西?

谢谢,

安德烈

2 个答案:

答案 0 :(得分:1)

为什么不简单地重用类型的实用方法:

public static Pattern createPattern(String regex, String type){
    try {
        return Pattern.compile(regex);
    } catch (PatternSyntaxException e ) {
        throw new IllegalArgumentException(
            String.format("Specify valid regular expression for %s", type)
        );
    }
}

答案 1 :(得分:0)

您可以查看JavaslangCyclop,它们都有Try实现。

独眼巨人尝试仅在特定的'withCatch'阶段捕获异常 - 这对应于初始化和主要执行阶段

以下是Cyclop试用的一个例子:

Try.withCatch(()-> Pattern.compile(freeUsersRegex))
   .onFail(PatternSyntaxException.class, 
              e -> throw new IllegalArgumentException("Specify valid regular expression for Free users group"));

Javaslang Try与Scala Try非常相似,它将捕获在合成过程中任何阶段抛出的所有异常。

以下是Javaslang试用的示例:

Try.of(()-> Pattern.compile(freeUsersRegex))
    .recover(e -> Match(e).of(
        Case(instanceOf(PatternSyntaxException.class), throw new IllegalArgumentException("Specify valid regular expression for Free users group")),
    ));