Skip to content

Your Fakes at compile-time. Type-safe test fake generation for Kotlin Multiplatform via FIR/IR compiler plugin.

License

Notifications You must be signed in to change notification settings

rsicarelli/fakt

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

    Fakt Logo

    Fakt

    Build Maven Central License Kotlin Documentation


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.2.21" // 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.trackCallCount.value)

🤝 Contributing

🐜 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.

About

Your Fakes at compile-time. Type-safe test fake generation for Kotlin Multiplatform via FIR/IR compiler plugin.

Resources

License

Contributing

Stars

Watchers

Forks

Contributors 2

  •  
  •  

Languages