我想Assert对象示例提供的公共API方法。伪代码示例:
Api api = Api.create(); assertThat(api) .hasPublicMethodNamed("foo") .doesNotHavePublicMethodNamed("bar");
有没有可能用ArchUnit来实现这一点?
yzuktlbb1#
ArchUnit规则基于类,但您可以向api示例请求其类(api.getClass())。JUnit4的完整示例(对于JUnit5,只需删除ArchUnitRunner):
api
api.getClass()
ArchUnitRunner
import com.tngtech.archunit.junit.AnalyzeClasses; import com.tngtech.archunit.junit.ArchTest; import com.tngtech.archunit.junit.ArchUnitRunner; import com.tngtech.archunit.lang.ArchRule; import org.junit.runner.RunWith; import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.methods; @RunWith(ArchUnitRunner.class) @AnalyzeClasses(packagesOf = SO76536531.class) public class SO76536531 { @ArchTest ArchRule public_API_naming_conventions = methods() .that().areDeclaredIn(getApi().getClass()) .and().arePublic() .should().haveName("foo") // .orShould().haveName("foo2") // to allow others names, too .andShould().notHaveName("bar"); // redundant; just for illustration Object getApi() { return new Api(); } static class Api { public void foo() { } // public void foo2() { // } public void bar() { } } }
(Note以这种方式允许名称foo和foo2并不能保证您的API具有这两种方法。但是你的问题没有具体说明你想得到什么。如有必要,请随时澄清。)
foo
foo2
ztyzrc3y2#
是,使用ArchRule:
ArchRule rule = classes().should(havePublicMethod("foo")).and(haveNoPublicMethod("bar")); rule.check(classes);
它检查所有类是否有一个名为“foo”的公共方法,并且没有一个名为“bar”的公共方法。您还可以使用ArchUnitRunner进行JUnit测试。
2条答案
按热度按时间yzuktlbb1#
ArchUnit规则基于类,但您可以向
api
示例请求其类(api.getClass()
)。JUnit4的完整示例(对于JUnit5,只需删除
ArchUnitRunner
):(Note以这种方式允许名称
foo
和foo2
并不能保证您的API具有这两种方法。但是你的问题没有具体说明你想得到什么。如有必要,请随时澄清。)ztyzrc3y2#
是,使用ArchRule:
它检查所有类是否有一个名为“foo”的公共方法,并且没有一个名为“bar”的公共方法。您还可以使用ArchUnitRunner进行JUnit测试。