import { Injector } from './injector';
import { Type, InjectionToken, Provider, Token } from './type';
export declare class Test<M extends AbstractTestModule> {
    private readonly TestModule;
    static createTestingModule<M extends AbstractTestModule>(overrideConfig?: {
        TestModule?: Type<M>;
        providers?: Provider[];
    }): Test<M>;
    readonly providersMap: Map<Token<unknown>, Provider>;
    private constructor();
    overrideProvider<T>(token: Token<T>): MockProvider<T, M>;
    compile(): M;
}
export declare class MockProvider<T, M extends AbstractTestModule> {
    private readonly test;
    private readonly token;
    constructor(test: Test<M>, token: Type<T> | InjectionToken<T>);
    useClass(value: Type<T>): Test<M>;
    useValue(value: T): Test<M>;
    useFactory(value: (...args: any[]) => any): Test<M>;
}
export declare abstract class AbstractTestModule {
    abstract getInstance<T>(provider: Provider<T>): T;
}
export declare class TestModule implements AbstractTestModule {
    private readonly injector;
    constructor(injector: Injector);
    getInstance<T>(token: Provider<T>): T;
}
