Click here to Skip to main content
Click here to Skip to main content
Add your own
alternative version

Using partial mocks for non public methods testing

, 10 Feb 2013
Pattern to follow using mock frameworks so non public methods can be tested. The code example is based on the RhinoMock framework but it is easily applicable to any other mock framework.
MockByExample.zip
MockByExample
.nuget
NuGet.exe
NuGet.targets
MockByExample
bin
Debug
Release
Calculators
obj
Debug
Properties
Tests
packages
RhinoMocks.3.6.1
lib
net
Rhino.Mocks.dll
RhinoMocks.3.6.1.nupkg
RhinoMocks.3.6.1.nuspec
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MockByExample.Calculators;
using Rhino.Mocks;

namespace MockByExample.Tests
{
    [TestClass]
    public class BusinessRuleCalculatorPublicApiTests : BusinessRuleCalculator
    {
        /// <summary>
        /// If zero value is passed the method returns Zero
        /// </summary>
        [TestMethod]
        public void GetRuleForZeroCase()
        {
            var calculator = new BusinessRuleCalculator();
            const RuleType expected = RuleType.Zero;
            var result = calculator.GetRule(0);
            Assert.AreEqual(expected, result);
        }

        /// <summary>
        /// Value is positive so ensure that the GetRuleForPositive
        /// method is invoked and that the GetRuleForNegative is not
        /// </summary>
        [TestMethod]
        public void GetRuleForPositiveValue()
        {
            var calculator = MockRepository
                .GeneratePartialMock<BusinessRuleCalculatorPublicApiTests>();

            const int value = 1;
            const RuleType expected = RuleType.PositiveNormalCase;
            calculator.Expect(c => c.GetRuleForPositive(value))
                .Return(expected)
                .Repeat.Once();

            calculator.Expect(c => c.GetRuleForNegative(value))
                .IgnoreArguments()
                .Repeat.Never();

            var result = calculator.GetRule(value);
            Assert.AreEqual(expected, result);
            calculator.VerifyAllExpectations();
        }

        /// <summary>
        /// Value is positive so ensure that the GetRuleForPositive
        /// method is invoked and that the GetRuleForNegative is not
        /// </summary>
        [TestMethod]
        public void GetRuleForNegativeValue()
        {
            var calculator = MockRepository.GeneratePartialMock<BusinessRuleCalculatorPublicApiTests>();
            const int value = -1;
            const RuleType expected = RuleType.NegativeNormalCase;
            calculator.Expect(c => c.GetRuleForPositive(value))
                .IgnoreArguments()
                .Repeat.Never();

            calculator.Expect(c => c.GetRuleForNegative(value))
                .Return(expected)
                .Repeat.Once();

            var result = calculator.GetRule(value);
            Assert.AreEqual(expected, result);
            calculator.VerifyAllExpectations();
        }
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Enrique Albert
Software Developer (Senior)
Ireland Ireland
No Biography provided
Follow on   Twitter

| Advertise | Privacy | Mobile
Web02 | 2.8.140814.1 | Last Updated 10 Feb 2013
Article Copyright 2013 by Enrique Albert
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid