Skip to main content

Depedency Injections di Test

Tidak ada magic di JUnit, sebenarnya fitur TestInfo yang sebelumnya kita bahas adalah bagian dari dependency injection di JUnit Dependency Injection sederhananya adalah bagaimana kita bisa memasukkan dependency (object/instance) ke dalam unit test secara otomatis tanpa proses manual. Saat kita menambah parameter di method unit test, sebenarnya kita bisa secara otomatis memasukkan parameter tersebut dengan bantuan ParameterResolver. Contohnya TestInfo yang kita bahas sebelumya, sebenarnya objectnya dibuat oleh TestInfoParameterResolver.

Membuat Parameter Resolver

import java.util.Random;

import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.ParameterContext;
import org.junit.jupiter.api.extension.ParameterResolutionException;
import org.junit.jupiter.api.extension.ParameterResolver;

public class RandomParameterResolver implements ParameterResolver {

private Random random = new Random();

@Override
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
throws ParameterResolutionException {
return parameterContext.getParameter().getType() == Random.class;
}

@Override
public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
throws ParameterResolutionException {
return random;
}

}

Membuat Test Menggunakan Parameter Resolver

Untuk menggunakan parameter resolver yang sudah kita buat, kita bisa menggunakan annontation @ExtendWith di test class. Jika lebih dari 1 parameter resolver, kita bisa menggunakan @Extentions.

import java.util.Random;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.extension.Extensions;

import com.timposulabs.belajar.Calculator;

@Extensions({
@ExtendWith(RandomParameterResolver.class)
})
public class RandomTest {

private Calculator calculator = new Calculator();

@Test
void testRandom(Random random) {
int a = random.nextInt();
int b = random.nextInt();

var result = calculator.add(a, b);
var expect = a + b;

Assertions.assertEquals(expect, result);
}

}