Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot instantiate @InjectMocks field named exception with java class

I have a class with user defined constructor.

public class Employee   
{
    @Inject
    private MyBean myBean;

    private String abcd;    

    protected Employee(Parameter1 param1, Parameter2 param2)
    { //some operations on method params
    //some operation on mybean
      this.abcd = "some value";
    }

    protected String getAbcd()
    {
        return nrOfAccesses;
    }

    protected void setAbcd(String abcd)
    {
        this.abcd = abcd;
    }

}

Test class

@RunWith(MockitoJUnitRunner.class)
public class TestEmployee
{


    @Mock
    private MyBean myBean;

    private Parameter1 param1;
    private Parameter2 param2;

    @InjectMocks
    private Employee employee;


    @Before
    public void prepare()
        throws Exception
    {
        //some intialization
        param1 = some value;
        param2 = some value;            
        when(myBean.get(eq("ID"))).thenReturn("1075");

    }

    @Test
    public void testEmployeeID()
    {
        employee = new Employee(param1, param2);
        assertThat(employee.getAbcd(), is("XYZC"));        
    }

I am getting exception as

org.mockito.exceptions.base.MockitoException: 
Cannot instantiate @InjectMocks field named 'employee' of type 'class com.xyz.Employee'.
You haven't provided the instance at field declaration so I tried to construct the instance.
However the constructor or the initialization block threw an exception : null

    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl$1.withBefores(JUnit45AndHigherRunnerImpl.java:27)
    at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:254)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37)
    at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.NullPointerException
like image 832
Patan Avatar asked Apr 15 '14 14:04

Patan


People also ask

How do you Injectmock an abstract class?

Since you cannot instantiate an Abstract class there is nothing to test. I would recommend that you create child class (it could be a nested class inside your test class), and then run your tests that way. Then you can use the @Mock , @InjectMocks as you would normally.

What is InjectMocks?

@InjectMocks is the Mockito Annotation. It allows you to mark a field on which an injection is to be performed. Injection allows you to, Enable shorthand mock and spy injections. Minimize repetitive mock and spy injection.

How do you mock inject an interface?

Here is what works: public class TestDo { @Mock private Do do; @Mock private ABC abc; @Before public void init() { MockitoAnnotations. initMocks(this); do. abc = abc; } @Test public void testDo() { when(do.

What is MockitoAnnotations initMocks this?

MockitoAnnotations. initMocks(this); initializes fields annotated with Mockito annotations. Allows shorthand creation of objects required for testing. Minimizes repetitive mock creation code. Makes the test class more readable.


1 Answers

if you do a employee = new Employee(param1, param2); you may as well skip @InjectMocks.

It is supposed to do the following:

@InjectMocks ClassUnderTest cut;  @Mock Dependency1 dep1; @Mock Dependency2 dep2;  @Before public void setup() {   initMocks(this); } 

omitting @InjectMocks the same behaviour can be achieved with the following code:

ClassUnderTest cut;  @Mock Dependency1 dep1; @Mock Dependency2 dep2;  @Before public void setup() {   initMocks(this);   cut = new ClassUnderTest(dep1, dep2); } 

In your specific case, you should mock param1 and param2. Never call the constructor manually when using @InjectMocks.

like image 158
Max Fichtelmann Avatar answered Sep 17 '22 04:09

Max Fichtelmann