Fakt
Your Fakes at compile-time. Type-safe test fake generation for Kotlin Multiplatform via FIR/IR compiler plugin.
Install / Use
/learn @rsicarelli/FaktREADME
Automate the fake-over-mock pattern. Fakt generates type-safe test doubles that eliminate boilerplate.
@Fake
interface UserRepository {
suspend fun getUser(id: String): User
}
// Use in tests
val fake = fakeUserRepository {
getUser { id -> User(id, "Alice") }
}
🤔 Why Fakt?
- Manual fakes scale poorly - Each type needs custom tracking, config, or cleanup code
- Manual fakes rot over time - Behavior diverges from real implementations without compile-time warnings
- Mocks verify interactions, not behavior - Testing how dependencies are called, not what code achieves
- Mocks make refactoring painful - Tests break even when behavior stays correct
- Google explicitly prefers fakes - Lightweight, framework-free, and resilient to refactoring
- Compile-time generation solves both problems - Automated fakes that never drift from interfaces
✨ Key Features
- Zero boilerplate - Compiler generates type-safe fakes automatically at build time
- Never drift from real code - Interface changes cause compile errors, not silent bugs
- Test what matters - Verify outcomes (state) instead of implementation details (calls)
- Works everywhere - All KMP targets without reflection, zero production dependencies
- Smart defaults - Sensible behaviors for all types, configure only what you need
- Real code, not magic - Generated .kt files are readable, not bytecode magic
⚡ Quick Start
1. Add plugin and dependency (build.gradle.kts):
plugins {
kotlin("multiplatform") version "2.3.20" // JVM or Android also works
id("com.rsicarelli.fakt") version "x.y.z"
}
kotlin {
// ... your targets
sourceSets {
commonMain {
dependencies {
implementation("com.rsicarelli.fakt:annotations:x.y.z")
}
}
}
}
2. Annotate interface:
import com.rsicarelli.fakt.Fake
@Fake
interface Analytics {
suspend fun track(event: String)
}
3. Build the project:
./gradlew build
4. Use in tests:
val events = mutableListOf<String>()
val fake = fakeAnalytics {
track { event -> events.add(event) }
}
fake.track("user_signup")
assertEquals(listOf("user_signup"), events)
assertEquals(1, fake.trackCalls.value.size)
🤝 Contributing
- Report Bugs: Bug Report
- Suggest Features: Feature Request - Your ideas shape our roadmap!
- Documentation: User Guide
- Contributing: See CONTRIBUTING.md
🐜 Our Mascot
The Tamandua eats bugs in nature. Fakt catches drift bugs at compile-time before they reach production.
License
Copyright (C) 2025 Rodrigo Sicarelli
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Related Skills
node-connect
335.8kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
82.7kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
335.8kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
82.7kCommit, push, and open a PR
