java ArchUnit -对象提供的方法

ac1kyiln  于 2023-06-28  发布在  Java
关注(0)|答案(2)|浏览(127)

我想Assert对象示例提供的公共API方法。
伪代码示例:

Api api = Api.create();

assertThat(api)
  .hasPublicMethodNamed("foo")
  .doesNotHavePublicMethodNamed("bar");

有没有可能用ArchUnit来实现这一点?

yzuktlbb

yzuktlbb1#

ArchUnit规则基于类,但您可以向api示例请求其类(api.getClass())。
JUnit4的完整示例(对于JUnit5,只需删除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以这种方式允许名称foofoo2并不能保证您的API具有这两种方法。但是你的问题没有具体说明你想得到什么。如有必要,请随时澄清。)

ztyzrc3y

ztyzrc3y2#

是,使用ArchRule:

ArchRule rule = classes().should(havePublicMethod("foo")).and(haveNoPublicMethod("bar"));
rule.check(classes);

它检查所有类是否有一个名为“foo”的公共方法,并且没有一个名为“bar”的公共方法。您还可以使用ArchUnitRunner进行JUnit测试。

相关问题