Skip to content

Instantly share code, notes, and snippets.

@vegaasen
Last active October 27, 2021 06:11
Show Gist options
  • Save vegaasen/24cb17810b359714916973944bee71d7 to your computer and use it in GitHub Desktop.
Save vegaasen/24cb17810b359714916973944bee71d7 to your computer and use it in GitHub Desktop.
Reset an Lazy-field in Kotlin
# What is this?
# Well..
# Sometimes you want to reset an val from a test where lazy props are being used.
# This helps you do just that.
# Amazing 🤩
# define the resetter 👇
import java.util.concurrent.atomic.AtomicReference
import kotlin.reflect.KProperty
fun <T> lazyWithReset(initializer: () -> T): ResetLazy<T> = ResetLazy(initializer)
class ResetLazy<T>(private val initializer: () -> T) {
private val lazy: AtomicReference<Lazy<T>> = AtomicReference(lazy(initializer))
operator fun getValue(ref: Any?, property: KProperty<*>): T = lazy.get().getValue(ref, property)
fun reset(): Unit = lazy.set(lazy(initializer))
}
// usage 👇
val environmentLazyHandler: RestLazy<String> = lazyWithReset { someSlowMethodToLocateEnvironment() }
val environment: String by environmentLazyHandler
// usage in e.g tests 👇
internal fun onEnvironment(environment: String, f: () -> Unit) {
environmentLazyHandler.reset()
val existingEnvironment = System.getProperty("somePropertyThatIsUsedInsomeSlowMethodToLocateEnvironment")
System.setProperty("somePropertyThatIsUsedInsomeSlowMethodToLocateEnvironment", environment)
f()
environmentLazyHandler.reset()
existingEnvironment
?.let { System.setProperty("somePropertyThatIsUsedInsomeSlowMethodToLocateEnvironment", existingEnvironment) }
?: System.clearProperty("somePropertyThatIsUsedInsomeSlowMethodToLocateEnvironment")
}
// usage in e.g tests 👇
@Test
fun `some test that requires environment a`() {
onEnvironment("env-a") {
somethingThatRequiresEnvironmentToBeReset()
}
}
@Test
fun `some test that requires environment b`() {
onEnvironment("env-b") {
somethingThatRequiresEnvironmentToBeReset()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment