Skip to content

Instantly share code, notes, and snippets.

@tanapoln
Last active April 7, 2020 16:00
Show Gist options
  • Save tanapoln/eae2b63868f6af94ce25d655064096f1 to your computer and use it in GitHub Desktop.
Save tanapoln/eae2b63868f6af94ce25d655064096f1 to your computer and use it in GitHub Desktop.
Transactional Unit Testing
package com.wongnai.linter;
import java.util.Arrays;
import org.junit.Test;
import org.springframework.transaction.annotation.Transactional;
import com.tngtech.archunit.base.DescribedPredicate;
import com.tngtech.archunit.core.domain.JavaClass;
import com.tngtech.archunit.core.domain.JavaClasses;
import com.tngtech.archunit.core.domain.JavaMethod;
import com.tngtech.archunit.core.importer.ClassFileImporter;
public class TransactionalAnnotationTest {
@Test
public void testTransactionalWithCheckedExceptionMustSetRollbackFor() {
JavaClasses importedClasses = new ClassFileImporter().importPackages("com.wongnai");
for (JavaClass clz : importedClasses) {
clz.getMethods().stream().filter(m -> m.isAnnotatedWith(Transactional.class))
.filter(m -> m.getThrowsClause().containsType(JavaClass.Predicates.assignableTo(Exception.class)))
.filter(m -> !Arrays.asList(m.getAnnotationOfType(Transactional.class).rollbackFor())
.contains(Exception.class))
.forEach(m -> {
String name = String.format("%s.%s", clz.getName(), m.getName());
throw new RuntimeException(name + " method must contains rollbackFor.");
});
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment