2014-04-15 60 views
4

我有一個用戶定義的構造函數的類。無法實例化@InjectMocks字段與java類名爲異常

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; 
    } 

} 

測試類

@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"));   
    } 

我得到異常作爲

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 

回答

6

如果你做一個employee = new Employee(param1, param2);你不妨跳過@InjectMocks

它應該做到以下幾點:

@InjectMocks 
ClassUnderTest cut; 

@Mock 
Dependency1 dep1; 
@Mock 
Dependency2 dep2; 

@Before 
public void setup() { 
    initMocks(this); 
} 

省略@InjectMocks可以用下面的代碼來實現相同的行爲:

ClassUnderTest cut; 

@Mock 
Dependency1 dep1; 
@Mock 
Dependency2 dep2; 

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

在特定情況下,你應該嘲笑param1param2 。在使用@InjectMocks時,切勿手動調用構造函數。

相關問題