3

In a class under test, if its constructor takes in an abstract class parameter can we mock it using mockito?

Ex

public abstract AbstractClass{
} 

//Class under test
public class SourceClass{            
  SourceClass(AbstractClass abstractClass){}            
}

@RunWith(MockitoJUnitRunner.class
public SourceClassTest{
 @Mock
  AbstractClass abstractClass;
}

whenever I do this i get this error

java.lang.ExceptionInInitializerError

Ther version of mockito I am using i 1.8.5

Gowrav
  • 289
  • 1
  • 4
  • 20
  • possible duplicate of [Using Mockito to test abstract classes](http://stackoverflow.com/questions/1087339/using-mockito-to-test-abstract-classes) – Mureinik Apr 29 '15 at 23:38

2 Answers2

3

Well, this code below works fine, just tell me if I need to add some comments to explain what I wrote, ok? (hey, I am using Mockito 1.10.8):

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;

abstract class AbstractClassToTest {
    public abstract String doSomething();
}

class ConcreteClass {

    private String something;

    public ConcreteClass(AbstractClassToTest aClass){
        this.something = aClass.doSomething();
    }

    public String getSomething(){
        return this.something;
    }
}

@RunWith(MockitoJUnitRunner.class)
public class TempTest {

    @Mock
    private AbstractClassToTest myClass;

    @Test
    public void canAbstractClassToTestBeMocked() {
        String expectedResult = "hello world!";
        Mockito
            .when(myClass.doSomething())
            .thenReturn(expectedResult);

        String actualResult = myClass.doSomething();

        Assert.assertEquals(expectedResult, actualResult);
    }

    @Test
    public void canConcreteClassBeInstantiatedWithMock() {
        String expectedResult = "hello world!";
        Mockito
            .when(myClass.doSomething())
            .thenReturn(expectedResult);

        ConcreteClass concrete = new ConcreteClass(myClass);

        String actualResult = concrete.getSomething();

        Assert.assertEquals(expectedResult, actualResult);
    }
}
germanio
  • 861
  • 1
  • 17
  • 27
  • if you are downvoting this, could you at least add an explanation why? does it not provide a clear answer to what is asked? – germanio May 05 '15 at 15:30
0

You cannot mock abstract classes, you have to mock a concrete one and pass that along. Just as regular code can't instantiate abstract classes.

Cristik
  • 30,989
  • 25
  • 91
  • 127