Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to mock An Abstract Base Class

Tags:

c#

moq

nunit

I have a base class called "Question" and several child classes such as "TrueFalse", "MultipleChoice", "MatchPairs" etc...

The base class has methods with logic that all of the child classes use, such as sending off scores and raising events.

I have set my unit tests up for the child classes but I am not sure how I can setup unit tests for the methods in the base class.

I did some searching and I understand I need to create a Mock of the class but I am not sure how to do this as I have only seen how to do this on an instantiable object.

I have Moq & NUnit installed in project so ideally id like to use this. I am still new to programming and this is my first time adding unit tests so I appreciate any advice you can give me.

I did a search on site first and found a couple of similar questions but they did not give any example on how to do it, just that it needed to be mocked.

Many thanks.

like image 415
Guerrilla Avatar asked Dec 15 '13 04:12

Guerrilla


People also ask

How do you mock an abstract class?

Mocking abstract class using PowerMock Using PowerMock instead of Mockito. mock() is a better approach as it can have control over the private as well as static methods. Step1: Create an abstract class named Abstract_class that contains both abstract and non-abstract methods.

Can you test an abstract class?

The answer is: always test only concrete classes; don't test abstract classes directly . The reason is that abstract classes are implementation details. From the client perspective, it doesn't matter how Student or Professor implement their GetSignature() methods.

Can we mock abstract class using MOQ?

You can use Moq to create mock objects that simulate or mimic a real object. Moq can be used to mock both classes and interfaces. However, there are a few limitations you should be aware of. The classes to be mocked can't be static or sealed, and the method being mocked should be marked as virtual.

Can we write JUnit for abstract class?

With JUnit, you can write a test class for any source class in your Java project. Even abstract classes, which, as you know, can't be instantiated, but may have constructors for the benefit of “concrete” subclasses.


1 Answers

From this answer it looks like what you need is something along these lines:

[Test]
public void MoqTest()
{
    var mock = new Moq.Mock<AbstractBaseClass>();            
    // set the behavior of mocked methods
    mock.Setup(abs => abs.Foo()).Returns(5);

    // getting an instance of the class
    var abstractBaseClass = mock.Object;
    // Asseting it actually works :)
    Assert.AreEqual(5, abstractBaseClass.Foo());
}
like image 194
Adam Rackis Avatar answered Oct 01 '22 08:10

Adam Rackis