Это может быть бесполезно, но я все равно скажу.
Кажется, вы пытаетесь проверить слишком много сразу, почему бы просто не проверить BillingService -> BillingValidation, затем BillingService -> BillingRepositoryи т. д. Таким образом, у вас будет набор тестов, доказывающих, что каждый из них работает, тогда, когда вы находитесь на уровне PublicApi, вам нужно только смоделировать ApiService, так как вы уже проверили все под ним, поэтому нет смысла тестировать егоснова.
Как правило, я буду тестировать только 1 слой за один раз, но я не знаю ваш полный сценарий, поэтому у вас может быть что-то, что я не учитываю, так что если это так, и вам действительно нужно протестироватьвсе это вместе, я бы просто ввел простую и легкую структуру DI, такую как Ninject или что-то в этом роде.
Таким образом, вы можете просто привязать все ваши типы к макетам, а затем создать из них свой PublicApi.
С ninject это будет выглядеть примерно так:
Kernel.Bind<UserRepository>.ToConst(YourMockUserRepositoryInstance);
Kernel.Bind<UserService>.ToConst(YourMockUserServiceInstance);
Kernel.Bind<BillingRepository>.ToConst(YourMockBillingRepositoryInstance);
Kernel.Bind<BillingValidation>.ToConst(YourMockBillingValidationInstance);
Kernel.Bind<BillingService>.ToConst(YourMockBillingServiceInstance);
Kernel.Bind<AccountingFacade>.ToConst(YourMockAccountingFacadeInstance);
Kernel.Bind<ApiService>.ToConst(YourMockApiServiceInstance);
Kernel.Bind<PublicApi>.ToSelf();
var publicApi = Kernel.Get<PublicApi>();
Хотя вы должны спросить себя, чтоты здесь тестируешь?если бы это были просто взаимодействия, я бы поступил так, как упомянул вначале, если его больше, то, возможно, подумал бы о последнем выборе.В любом случае, я надеюсь, что это даст вам несколько вариантов.