From ec45c272ee7af5d8211559ae448b434efd060436 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Breu=C3=9F=20Valentin?= Date: Wed, 11 Feb 2026 14:28:48 +0100 Subject: [PATCH 1/2] fix: support interfaces from different namespaces as additional interfaces --- .../MockGenerator.cs | 18 ++++++- .../Sources.ForMock.CombinationExtensions.cs | 8 ++-- .../MockGeneratorTests.cs | 48 +++++++++++++++++++ .../Mockolate.Tests/MockTests.CreateTests.cs | 33 +++++++++++++ 4 files changed, 102 insertions(+), 5 deletions(-) diff --git a/Source/Mockolate.SourceGenerators/MockGenerator.cs b/Source/Mockolate.SourceGenerators/MockGenerator.cs index 9a0f1242..9ad85c57 100644 --- a/Source/Mockolate.SourceGenerators/MockGenerator.cs +++ b/Source/Mockolate.SourceGenerators/MockGenerator.cs @@ -38,6 +38,7 @@ void IIncrementalGenerator.Initialize(IncrementalGeneratorInitializationContext private static void Execute(ImmutableArray mocksToGenerate, SourceProductionContext context) { (string Name, MockClass MockClass)[] namedMocksToGenerate = CreateNames(mocksToGenerate); + Dictionary<(string? Namespace, string ClassName), HashSet> allUsedNames = []; HashSet<(string? BaseNamespace, string BaseClassName, string? Namespace, string ClassName)> generatedAdditionalInterfacesByBaseType = new(); @@ -55,17 +56,30 @@ private static void Execute(ImmutableArray mocksToGenerate, SourcePro if (mockToGenerate.MockClass.AdditionalImplementations.Any() && mockToGenerate.MockClass.Delegate is null) { Class[] interfacesToGenerate = mockToGenerate.MockClass.DistinctAdditionalImplementations() - .Where(impl => generatedAdditionalInterfacesByBaseType .Add( + .Where(impl => generatedAdditionalInterfacesByBaseType.Add( (mockToGenerate.MockClass.Namespace, mockToGenerate.MockClass.ClassName, impl.Namespace, impl.ClassName))) .ToArray(); if (interfacesToGenerate.Length > 0) { + (string? Namespace, string ClassName) key = (mockToGenerate.MockClass.Namespace, + mockToGenerate.MockClass.ClassName); + HashSet usedNames; + if (allUsedNames.ContainsKey(key)) + { + usedNames = allUsedNames[key]; + } + else + { + usedNames = new HashSet(); + allUsedNames.Add(key, usedNames); + } + context.AddSource($"MockFor{mockToGenerate.Name}Extensions.g.cs", SourceText.From( Sources.Sources.ForMockCombinationExtensions(mockToGenerate.Name, mockToGenerate.MockClass, - interfacesToGenerate), + interfacesToGenerate, usedNames), Encoding.UTF8)); } } diff --git a/Source/Mockolate.SourceGenerators/Sources/Sources.ForMock.CombinationExtensions.cs b/Source/Mockolate.SourceGenerators/Sources/Sources.ForMock.CombinationExtensions.cs index 7564fb0b..502c65a2 100644 --- a/Source/Mockolate.SourceGenerators/Sources/Sources.ForMock.CombinationExtensions.cs +++ b/Source/Mockolate.SourceGenerators/Sources/Sources.ForMock.CombinationExtensions.cs @@ -9,8 +9,11 @@ internal static partial class Sources { private static readonly Regex InvalidIdentifierChars = new("[^a-zA-Z0-9_]", RegexOptions.Compiled); - public static string ForMockCombinationExtensions(string name, MockClass mockClass, - IEnumerable distinctAdditionalImplementations) + public static string ForMockCombinationExtensions( + string name, + MockClass mockClass, + IEnumerable distinctAdditionalImplementations, + HashSet usedNames) { StringBuilder sb = InitializeBuilder([ "Mockolate.Exceptions", @@ -61,7 +64,6 @@ private static Mock GetMockOrThrow(T subject) sb.Append("\textension(").Append(mockClass.ClassFullName).AppendLine(" subject)"); sb.AppendLine("\t{"); - HashSet usedNames = []; foreach (Class @class in distinctAdditionalImplementations) { AppendAdditionalMockExtensions(sb, @class, usedNames); diff --git a/Tests/Mockolate.SourceGenerators.Tests/MockGeneratorTests.cs b/Tests/Mockolate.SourceGenerators.Tests/MockGeneratorTests.cs index 449d0c31..7b3dad9f 100644 --- a/Tests/Mockolate.SourceGenerators.Tests/MockGeneratorTests.cs +++ b/Tests/Mockolate.SourceGenerators.Tests/MockGeneratorTests.cs @@ -161,6 +161,54 @@ await ThatAll( ); } + [Fact] + public async Task WhenNamesConflictForAdditionalClassesInDifferentNamespaces_ShouldAppendAnIndex() + { + GeneratorResult result = Generator + .Run(""" + using System; + using System.Threading; + using System.Threading.Tasks; + using Mockolate; + + namespace MyCode + { + public class Program + { + public static void Main(string[] args) + { + _ = Mock.Create(); + _ = Mock.Create(); + } + } + + public interface IMyInt { } + + public interface IMyService { } + } + namespace OtherNamespace + { + public interface IMyInt { } + } + """, typeof(HttpResponseMessage)); + + await ThatAll( + That(result.Sources.Keys).Contains([ + "MockForIMyService_IMyInt.g.cs", + "MockForIMyService_IMyInt_1.g.cs", + "MockForIMyService_IMyIntExtensions.g.cs", + "MockForIMyService_IMyInt_1Extensions.g.cs", + ]).InAnyOrder(), + That(result.Sources["MockForIMyService_IMyIntExtensions.g.cs"]) + .Contains("public IMockSetup SetupIMyIntMock").And + .Contains("public IMockVerify VerifyOnIMyIntMock"), + That(result.Sources["MockForIMyService_IMyInt_1Extensions.g.cs"]) + .Contains("public IMockSetup SetupIMyInt__2Mock").And + .Contains("public IMockVerify VerifyOnIMyInt__2Mock"), + That(result.Diagnostics).IsEmpty() + ); + } + [Fact] public async Task WhenUsingCustomMockGeneratorAttribute_ShouldNotBeIncluded() { diff --git a/Tests/Mockolate.Tests/MockTests.CreateTests.cs b/Tests/Mockolate.Tests/MockTests.CreateTests.cs index 07b34d5f..89e9c93b 100644 --- a/Tests/Mockolate.Tests/MockTests.CreateTests.cs +++ b/Tests/Mockolate.Tests/MockTests.CreateTests.cs @@ -657,5 +657,38 @@ await That(Act).Throws() .WithMessage( "The mock declaration has 1 additional implementation that is not an interface: Mockolate.Tests.TestHelpers.MyServiceBase"); } + + [Fact] + public async Task WithAdditionalInterfacesFromDifferentNamespaces_ShouldHaveUniqueName() + { + int invocationCount1 = 0; + int invocationCount2 = 0; + IChocolateDispenser sut1 = Mock.Create(); + IChocolateDispenser sut2 = Mock.Create(); + + sut1.SetupIMyServiceMock.Method + .DoSomething(It.IsAny()) + .Do(() => invocationCount1++); + sut2.SetupIMyService__2Mock.Method + .DoSomething(It.IsAny()) + .Do(() => invocationCount2++); + + ((TestHelpers.IMyService)sut1).DoSomething(1); + ((TestHelpers.IMyService)sut1).DoSomething(2); + ((TestHelpers.Other.IMyService)sut2).DoSomething(1); + ((TestHelpers.Other.IMyService)sut2).DoSomething(2); + ((TestHelpers.Other.IMyService)sut2).DoSomething(3); + + await That(invocationCount1).IsEqualTo(2); + await That(invocationCount2).IsEqualTo(3); + await That(sut1.VerifyOnIMyServiceMock.Invoked + .DoSomething(It.IsAny())).Exactly(2); + await That(() => sut1.VerifyOnIMyService__2Mock) + .Throws(); + await That(() => sut2.VerifyOnIMyServiceMock) + .Throws(); + await That(sut2.VerifyOnIMyService__2Mock.Invoked + .DoSomething(It.IsAny())).Exactly(3); + } } } From beafcd4c4dd5d0d47cfab96c9f7f6210c6b489f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Breu=C3=9F=20Valentin?= Date: Wed, 11 Feb 2026 14:56:59 +0100 Subject: [PATCH 2/2] Include namespace when differing from the mock class --- .../Sources.ForMock.CombinationExtensions.cs | 24 +++++++++------- Tests/Mockolate.ExampleTests/ExampleTests.cs | 12 ++++---- Tests/Mockolate.Internal.Tests/WebTests.cs | 12 ++++---- .../GeneralTests.cs | 2 +- .../MockGeneratorTests.cs | 28 +++++++++---------- .../Mockolate.Tests/MockTests.CreateTests.cs | 12 ++++---- .../Mockolate.Tests/MockTests.FactoryTests.cs | 4 +-- 7 files changed, 49 insertions(+), 45 deletions(-) diff --git a/Source/Mockolate.SourceGenerators/Sources/Sources.ForMock.CombinationExtensions.cs b/Source/Mockolate.SourceGenerators/Sources/Sources.ForMock.CombinationExtensions.cs index 502c65a2..e8d502f3 100644 --- a/Source/Mockolate.SourceGenerators/Sources/Sources.ForMock.CombinationExtensions.cs +++ b/Source/Mockolate.SourceGenerators/Sources/Sources.ForMock.CombinationExtensions.cs @@ -66,7 +66,7 @@ private static Mock GetMockOrThrow(T subject) foreach (Class @class in distinctAdditionalImplementations) { - AppendAdditionalMockExtensions(sb, @class, usedNames); + AppendAdditionalMockExtensions(sb, mockClass, @class, usedNames); } sb.AppendLine("\t}"); @@ -76,15 +76,19 @@ private static Mock GetMockOrThrow(T subject) return sb.ToString(); } - private static void AppendAdditionalMockExtensions(StringBuilder sb, Class @class, HashSet usedNames) + private static void AppendAdditionalMockExtensions(StringBuilder sb, MockClass mockClass, Class @class, + HashSet usedNames) { sb.AppendLine(); int nameSuffix = 1; - string sanitizedClassName = InvalidIdentifierChars.Replace(@class.ClassName, "_"); + string sanitizedClassName = InvalidIdentifierChars.Replace( + mockClass.Namespace == @class.Namespace + ? @class.ClassName + : $"{@class.Namespace}.{@class.ClassName}", "_"); string name = sanitizedClassName; while (!usedNames.Add(name)) { - name = $"{sanitizedClassName}__{++nameSuffix}"; + name = $"{sanitizedClassName}_{++nameSuffix}"; } string mockExpression = @@ -95,8 +99,8 @@ private static void AppendAdditionalMockExtensions(StringBuilder sb, Class @clas .Append("\" />") .AppendLine(); sb.Append("\t\t/// ").AppendLine(); - sb.Append("\t\tpublic IMockSetup<").Append(@class.ClassFullName).Append("> Setup").Append(name) - .Append("Mock") + sb.Append("\t\tpublic IMockSetup<").Append(@class.ClassFullName).Append("> Setup_").Append(name) + .Append("_Mock") .AppendLine(); sb.Append("\t\t\t=> ").Append(mockExpression).AppendLine(); @@ -108,8 +112,8 @@ private static void AppendAdditionalMockExtensions(StringBuilder sb, Class @clas .Append(@class.ClassFullName.EscapeForXmlDoc()) .Append("\" />").AppendLine(); sb.Append("\t\t/// ").AppendLine(); - sb.Append("\t\tpublic IMockRaises<").Append(@class.ClassFullName).Append("> RaiseOn") - .Append(name).Append("Mock").AppendLine(); + sb.Append("\t\tpublic IMockRaises<").Append(@class.ClassFullName).Append("> RaiseOn_") + .Append(name).Append("_Mock").AppendLine(); sb.Append("\t\t\t=> ").Append(mockExpression).AppendLine(); } @@ -118,8 +122,8 @@ private static void AppendAdditionalMockExtensions(StringBuilder sb, Class @clas sb.Append("\t\t/// Verifies the interactions with the mocked subject of on the mock.").AppendLine(); sb.Append("\t\t/// ").AppendLine(); - sb.Append("\t\tpublic IMockVerify<").Append(@class.ClassFullName).Append("> VerifyOn").Append(name) - .Append("Mock") + sb.Append("\t\tpublic IMockVerify<").Append(@class.ClassFullName).Append("> VerifyOn_").Append(name) + .Append("_Mock") .AppendLine(); sb.Append("\t\t\t=> ").Append(mockExpression).AppendLine(); } diff --git a/Tests/Mockolate.ExampleTests/ExampleTests.cs b/Tests/Mockolate.ExampleTests/ExampleTests.cs index 26271188..db90e14a 100644 --- a/Tests/Mockolate.ExampleTests/ExampleTests.cs +++ b/Tests/Mockolate.ExampleTests/ExampleTests.cs @@ -20,14 +20,14 @@ public async Task Any_ShouldAlwaysMatch() Guid id = Guid.NewGuid(); MyClass mock = Mock.Create(BaseClass.WithConstructorParameters(3)); - mock.SetupIExampleRepositoryMock.Method.AddUser( + mock.Setup_IExampleRepository_Mock.Method.AddUser( It.IsAny()) .Returns(new User(id, "Alice")); User result = ((IExampleRepository)mock).AddUser("Bob"); await That(result).IsEqualTo(new User(id, "Alice")); - mock.VerifyOnIExampleRepositoryMock.Invoked.AddUser(It.Is("Bob")).Once(); + mock.VerifyOn_IExampleRepository_Mock.Invoked.AddUser(It.Is("Bob")).Once(); } [Fact] @@ -93,14 +93,14 @@ public async Task WithAdditionalInterface_ShouldWork() { Guid id = Guid.NewGuid(); IExampleRepository mock = Mock.Create(); - mock.SetupIOrderRepositoryMock.Method + mock.Setup_IOrderRepository_Mock.Method .AddOrder(It.IsAny()) .Returns(new Order(id, "Order1")); Order result = ((IOrderRepository)mock).AddOrder("foo"); await That(result.Name).IsEqualTo("Order1"); - mock.VerifyOnIOrderRepositoryMock.Invoked.AddOrder(It.Is("foo")).Once(); + mock.VerifyOn_IOrderRepository_Mock.Invoked.AddOrder(It.Is("foo")).Once(); await That(mock).Is(); await That(mock).Is(); } @@ -142,7 +142,7 @@ public async Task WithExplicitCastToAdditionalInterfaceSetup_ShouldWork() Order result = ((IOrderRepository)mock).AddOrder("foo"); await That(result.Name).IsEqualTo("Order1"); - mock.VerifyOnIOrderRepositoryMock.Invoked.AddOrder(It.Is("foo")).Once(); + mock.VerifyOn_IOrderRepository_Mock.Invoked.AddOrder(It.Is("foo")).Once(); await That(mock).Is(); await That(mock).Is(); } @@ -152,7 +152,7 @@ public async Task WithExplicitCastToAdditionalInterfaceVerify_ShouldWork() { Guid id = Guid.NewGuid(); IExampleRepository mock = Mock.Create(); - mock.SetupIOrderRepositoryMock.Method + mock.Setup_IOrderRepository_Mock.Method .AddOrder(It.IsAny()) .Returns(new Order(id, "Order1")); diff --git a/Tests/Mockolate.Internal.Tests/WebTests.cs b/Tests/Mockolate.Internal.Tests/WebTests.cs index b4827f52..806a2189 100644 --- a/Tests/Mockolate.Internal.Tests/WebTests.cs +++ b/Tests/Mockolate.Internal.Tests/WebTests.cs @@ -36,14 +36,14 @@ public async Task WhenParameterDoesNotImplementIHttpRequestMessagePropertyParame { ItExtensions.IHttpContentParameter parameter = Mock.Create(); - parameter.SetupIParameterMock.Method.Matches(It.IsAny()).Returns(true); + parameter.Setup_Mockolate_Parameters_IParameter_Mock.Method.Matches(It.IsAny()).Returns(true); ItExtensions.IStringContentBodyParameter sut = parameter.WithString("foo"); bool result = ((IHttpRequestMessagePropertyParameter)sut).Matches(null, null); await That(result).IsTrue(); - await That(parameter.VerifyOnIParameterMock.Invoked + await That(parameter.VerifyOn_Mockolate_Parameters_IParameter_Mock.Invoked .Matches(It.IsNull())) .Once(); } @@ -54,8 +54,8 @@ public async Task WhenParameterImplementsIHttpRequestMessagePropertyParameter_Sh ItExtensions.IHttpContentParameter parameter = Mock.Create>(); - parameter.SetupIParameterMock.Method.Matches(It.IsAny()).Returns(false); - parameter.SetupIHttpRequestMessagePropertyParameter_HttpContent_Mock.Method + parameter.Setup_Mockolate_Parameters_IParameter_Mock.Method.Matches(It.IsAny()).Returns(false); + parameter.Setup_IHttpRequestMessagePropertyParameter_HttpContent__Mock.Method .Matches(It.IsAny(), It.IsAny()).Returns(true); ItExtensions.IStringContentBodyParameter sut = parameter.WithString("foo"); @@ -63,10 +63,10 @@ public async Task WhenParameterImplementsIHttpRequestMessagePropertyParameter_Sh bool result = ((IHttpRequestMessagePropertyParameter)sut).Matches(null, null); await That(result).IsTrue(); - await That(parameter.VerifyOnIHttpRequestMessagePropertyParameter_HttpContent_Mock.Invoked + await That(parameter.VerifyOn_IHttpRequestMessagePropertyParameter_HttpContent__Mock.Invoked .Matches(It.IsNull(), It.IsNull())) .Once(); - await That(parameter.VerifyOnIParameterMock.Invoked + await That(parameter.VerifyOn_Mockolate_Parameters_IParameter_Mock.Invoked .Matches(It.IsNull())) .Never(); } diff --git a/Tests/Mockolate.SourceGenerators.Tests/GeneralTests.cs b/Tests/Mockolate.SourceGenerators.Tests/GeneralTests.cs index 1f51431a..fa645bbb 100644 --- a/Tests/Mockolate.SourceGenerators.Tests/GeneralTests.cs +++ b/Tests/Mockolate.SourceGenerators.Tests/GeneralTests.cs @@ -354,7 +354,7 @@ public interface IMyInterface await That(result.Sources).ContainsKey("MockForIMyInterface_IMyInterface_IMyInterfaceExtensions.g.cs") .WhoseValue - .Contains("public IMockSetup SetupIMyInterface__2Mock"); + .Contains("public IMockSetup Setup_MyCode_N2_IMyInterface_Mock"); } [Fact] diff --git a/Tests/Mockolate.SourceGenerators.Tests/MockGeneratorTests.cs b/Tests/Mockolate.SourceGenerators.Tests/MockGeneratorTests.cs index 7b3dad9f..1065918d 100644 --- a/Tests/Mockolate.SourceGenerators.Tests/MockGeneratorTests.cs +++ b/Tests/Mockolate.SourceGenerators.Tests/MockGeneratorTests.cs @@ -200,11 +200,11 @@ await ThatAll( "MockForIMyService_IMyInt_1Extensions.g.cs", ]).InAnyOrder(), That(result.Sources["MockForIMyService_IMyIntExtensions.g.cs"]) - .Contains("public IMockSetup SetupIMyIntMock").And - .Contains("public IMockVerify VerifyOnIMyIntMock"), + .Contains("public IMockSetup Setup_IMyInt_Mock").And + .Contains("public IMockVerify VerifyOn_IMyInt_Mock"), That(result.Sources["MockForIMyService_IMyInt_1Extensions.g.cs"]) - .Contains("public IMockSetup SetupIMyInt__2Mock").And - .Contains("public IMockVerify VerifyOnIMyInt__2Mock"), + .Contains("public IMockSetup Setup_OtherNamespace_IMyInt_Mock").And + .Contains("public IMockVerify VerifyOn_OtherNamespace_IMyInt_Mock"), That(result.Diagnostics).IsEmpty() ); } @@ -507,19 +507,19 @@ await That(result.Sources) .DoesNotContainKey("MockForIBaseInterface_IAdditionalInterface1_IAdditionalInterface2_ICommonInterfaceExtensions.g.cs"); await That(result.Sources["MockForIBaseInterface_ICommonInterfaceExtensions.g.cs"]) - .Contains("SetupICommonInterfaceMock").And - .Contains("VerifyOnICommonInterfaceMock"); + .Contains("Setup_ICommonInterface_Mock").And + .Contains("VerifyOn_ICommonInterface_Mock"); await That(result.Sources["MockForIBaseInterface_ICommonInterface_IAdditionalInterface1Extensions.g.cs"]) - .DoesNotContain("SetupICommonInterfaceMock").And - .DoesNotContain("VerifyOnICommonInterfaceMock").And - .Contains("SetupIAdditionalInterface1Mock").And - .Contains("VerifyOnIAdditionalInterface1Mock"); + .DoesNotContain("Setup_ICommonInterface_Mock").And + .DoesNotContain("VerifyOn_ICommonInterface_Mock").And + .Contains("Setup_IAdditionalInterface1_Mock").And + .Contains("VerifyOn_IAdditionalInterface1_Mock"); await That(result.Sources["MockForIBaseInterface_IAdditionalInterface2_ICommonInterfaceExtensions.g.cs"]) - .DoesNotContain("SetupICommonInterfaceMock").And - .DoesNotContain("VerifyOnICommonInterfaceMock").And - .Contains("SetupIAdditionalInterface2Mock").And - .Contains("VerifyOnIAdditionalInterface2Mock"); + .DoesNotContain("Setup_ICommonInterface_Mock").And + .DoesNotContain("VerifyOn_ICommonInterface_Mock").And + .Contains("Setup_IAdditionalInterface2_Mock").And + .Contains("VerifyOn_IAdditionalInterface2_Mock"); } } diff --git a/Tests/Mockolate.Tests/MockTests.CreateTests.cs b/Tests/Mockolate.Tests/MockTests.CreateTests.cs index 89e9c93b..e0ebfa31 100644 --- a/Tests/Mockolate.Tests/MockTests.CreateTests.cs +++ b/Tests/Mockolate.Tests/MockTests.CreateTests.cs @@ -666,10 +666,10 @@ public async Task WithAdditionalInterfacesFromDifferentNamespaces_ShouldHaveUniq IChocolateDispenser sut1 = Mock.Create(); IChocolateDispenser sut2 = Mock.Create(); - sut1.SetupIMyServiceMock.Method + sut1.Setup_IMyService_Mock.Method .DoSomething(It.IsAny()) .Do(() => invocationCount1++); - sut2.SetupIMyService__2Mock.Method + sut2.Setup_Mockolate_Tests_TestHelpers_Other_IMyService_Mock.Method .DoSomething(It.IsAny()) .Do(() => invocationCount2++); @@ -681,13 +681,13 @@ public async Task WithAdditionalInterfacesFromDifferentNamespaces_ShouldHaveUniq await That(invocationCount1).IsEqualTo(2); await That(invocationCount2).IsEqualTo(3); - await That(sut1.VerifyOnIMyServiceMock.Invoked + await That(sut1.VerifyOn_IMyService_Mock.Invoked .DoSomething(It.IsAny())).Exactly(2); - await That(() => sut1.VerifyOnIMyService__2Mock) + await That(() => sut1.VerifyOn_Mockolate_Tests_TestHelpers_Other_IMyService_Mock) .Throws(); - await That(() => sut2.VerifyOnIMyServiceMock) + await That(() => sut2.VerifyOn_IMyService_Mock) .Throws(); - await That(sut2.VerifyOnIMyService__2Mock.Invoked + await That(sut2.VerifyOn_Mockolate_Tests_TestHelpers_Other_IMyService_Mock.Invoked .DoSomething(It.IsAny())).Exactly(3); } } diff --git a/Tests/Mockolate.Tests/MockTests.FactoryTests.cs b/Tests/Mockolate.Tests/MockTests.FactoryTests.cs index e2ce535f..6ab6230f 100644 --- a/Tests/Mockolate.Tests/MockTests.FactoryTests.cs +++ b/Tests/Mockolate.Tests/MockTests.FactoryTests.cs @@ -191,8 +191,8 @@ public async Task Create_WithSameNamedInterfaces_ShouldAppendIndex() MyServiceBase mock = factory.Create(); - mock.SetupIMyServiceMock.Method.DoSomething(It.IsAny()).Do(() => isDoSomethingCalled1 = true); - mock.SetupIMyService__2Mock.Method.DoSomething(It.IsAny()).Do(() => isDoSomethingCalled2 = true); + mock.Setup_IMyService_Mock.Method.DoSomething(It.IsAny()).Do(() => isDoSomethingCalled1 = true); + mock.Setup_Mockolate_Tests_TestHelpers_Other_IMyService_Mock.Method.DoSomething(It.IsAny()).Do(() => isDoSomethingCalled2 = true); ((TestHelpers.IMyService)mock).DoSomething(1);