fuin.org

Small Open Source Java Tools and Libraries

Asserting test coverage

A good approach is to have at least one test class for every production class.

If you have classes this rule-of-thumb does not apply, you can:
  • Write a dummy test class with a comment that describes why not...
  • Use an AssertCoverage.ClassFilter to exclude the classes

Test all classes in "src/main/java":

@Test
public final void testCoverage() {
    AssertCoverage.assertEveryClassHasATest(new File("src/main/java"));
}

Example how to exclude all sub classes of a "BaseEntity" class and classes defined in a property file:

@Test
public final void testCoverage() {

    // Define base source code directory
    final File baseDir = new File("src/main/java");
    
    // Exclude all classes of a common type
    final AssertCoverage.ClassFilter filterEntities = new AssertCoverage.ClassFilter() {
        public boolean isIncludeClass(final Class<?> clasz) {
            return !BaseEntity.class.isAssignableFrom(clasz);
        }
    };
    
    // Exclude all classes defined in a property file with 
    // format "full.qualified.class.name=comment":
    // assertcoverage.ExampleExcludedClass=Already tested by integration test
    final Properties excludes = Utils4J.loadProperties(ExampleExcludedClass.class, "excludeClasses.properties");
    final Set<Object> keySet = excludes.keySet();
    final String[] fqnClassNames = keySet.toArray(new String[keySet.size()]);
    final AssertCoverage.ExcludeListClassFilter filterClasses = new AssertCoverage.ExcludeListClassFilter(fqnClassNames);
    
    // Create AND filter
    final AssertCoverage.AndClassFilter filter = new AssertCoverage.AndClassFilter(filterEntities, filterClasses);
    
    // Start test
    AssertCoverage.assertEveryClassHasATest(baseDir, filter);

}