Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to mock an internal method of a class?

I have a class which has an internal method and I want to mock the internal method. However, it is not calling the mocked function, but the original function. Is there any way to achieve this?

I have many classes and methods of the classes to test using the Moq. Many classes are internal, many have internal methods, many have not-virtual methods. And I cannot change the signature on the methods and classes. How can I go about testing this scenario using Moq? Or what other testing framework could I use which is easy to learn and work with?

like image 391
Shailendra Avatar asked Sep 05 '25 09:09

Shailendra


2 Answers

You can easily mock internal virtual methods by adding the following to your AssemblyInfo.cs:

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] // namespace in Moq
[assembly: InternalsVisibleTo("YourTestClass")]

If your assembly is strongly named, you'll need to include the public key for DynamicProxyGenAssembly2 (Thanks to comment by @bvgheluwe; source: Moq quickstart guide):

[assembly:InternalsVisibleTo("DynamicProxyGenAssembly2,PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")]

I don't understand why the accepted answer says you should never do it. Isn't that what you do when you use the 'Extract and Override' (local factory method) dependency injection technique outlined by Roy Osherove in Chapter 3 of The Art Of Unit Testing?

like image 124
Daryn Avatar answered Sep 09 '25 16:09

Daryn


Mark the method as internal *protected* (also virtual of course)

like image 42
andreister Avatar answered Sep 09 '25 16:09

andreister