Home > Software design >  Java Truth OR assertion
Java Truth OR assertion

Time:08-19

I would like to check with Java Truth assertion library if any of the following statements is satisfied:

assertThat(strToCheck).startsWith("a");
assertThat(strToCheck).contains("123");
assertThat(strToCheck).endsWith("@");

In another word, I am checking if strToCheck starts with a OR contains the substring 123, OR ends with @. Aka, if any of the 3 conditions applies. I am just giving the assertions as an example.

Is there a way to do the logical OR assertion with Truth?

I know with Hamcrest, we could do something like:

assertThat(strToCheck, anyOf(startsWith("a"), new StringContains("123"), endsWith("@")));

CodePudding user response:

assertTrue(strToCheck.startsWith("a") || strToCheck.contains("123") ||strToCheck.endsWith("@")); 

You can do what you asked for with this single line only.

CodePudding user response:

Going to flip this on its head, since you're talking about testing.

You should be explicit about what you're asserting, and not so wide-open about it.

For instance, it sounds like you're expecting something like:

  • a...123@
  • a123@
  • a
  • @
  • 123

...but you may only actually care about one of those cases.

So I would encourage you to explicitly validate only one of each. Even though Hamcrest allows you to find any match, this too feels like an antipattern; you should be more explicit about what it is you're expecting given a set of strings.

CodePudding user response:

Why not use a regular expression to solve this:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
  public static void main(String[] args) {

String strToCheck = "afoobar123barfoo@";
    Pattern pattern = Pattern.compile("a.*123.*@");
    Matcher matcher = pattern.matcher(strToCheck);
    boolean matchFound = matcher.find();
    //matchFound now contains a true/false value. 
  }
}
  • Related