alorma
05/19/2022, 8:36 AM./gradlew deteket
on the real app code doesn’t throw any smell… code in 🧵alorma
05/19/2022, 8:37 AMclass AgreementObjectStubs : Rule() {
override val issue = Issue(
javaClass.simpleName,
Severity.Performance,
"Stubs (api mock) should be declared as object instead of class.",
Debt(mins = 1)
)
override fun visitClassOrObject(classOrObject: KtClassOrObject) {
super.visitClassOrObject(classOrObject)
if (!classOrObject.isStub()) return
if (classOrObject.isObject()) return
report(
CodeSmell(
issue,
Entity.from(classOrObject),
message = "Avoid using class to define Stub. Use object instead"
)
)
}
private fun KtClassOrObject.isStub(): Boolean = getSuperNames().firstOrNull() == "Stub"
private fun KtClassOrObject.isObject(): Boolean = getDeclarationKeyword()?.text == "object"
}
`Test`:
class AgreementObjectStubsTest {
private val subject = AgreementObjectStubs()
@Test
fun `should complain when using class`() {
val content = """class MyStub: Stub<MyStubRequest, MyStubResponse>(
MyStubRequest(), MyStubResponse::class, "My Stub group"
)
"""
val findings = subject.lint(content)
assertThat(findings).hasSize(1)
assertThat(findings.first().id).isEqualTo("AgreementObjectStubs")
}
@Test
fun `should not complain when using object`() {
val content = """object MyStub: Stub<MyStubRequest, MyStubResponse>(
MyStubRequest(), MyStubResponse::class, "My Stub group"
)
"""
val findings = subject.lint(content)
assertThat(findings).hasSize(0)
}
}
alorma
05/19/2022, 8:37 AMclass AgreementsRuleSetProvider : RuleSetProvider {
override val ruleSetId: String = "team-agreements"
override fun instance(config: Config): RuleSet = RuleSet(
ruleSetId,
listOf(
AgreementObjectStubs()
)
)
}
Javier
05/19/2022, 8:53 AMalorma
05/19/2022, 8:53 AMalorma
05/19/2022, 8:53 AMalorma
05/19/2022, 8:53 AMgammax
05/19/2022, 10:58 AMHow are you integrating your rule? With Gradle? If so, are you usingon the real app code doesn’t throw any smell… code in 🧵./gradlew deteket
detektPlugin
?