2014-11-14 80 views
0

我試圖運行我的junit測試用例,但它顯示爲nullpointerexception。當我調試它顯示爲java.lang.reflect.invocationtargetexception導致null。請幫幫我。在Junit中導致java.lang.reflect.invocationtargetexception null null

public class StudentTest {

StudentService stuService;

StudentDAO stuDAO; 
StudentVO stuVo; 

@Before 
public void setUp() throws Exception { 
    System.out.println("In Setup"); 
    stuVo=new StudentVO(); 
    stuService=new StudentService(); 
    stuDAO=Mockito.mock(StudentDAO.class); 
    //MockitoAnnotations.initMocks(this); 
    stuVo.setStudId("123"); 
    stuVo.setName("user1"); 
    Mockito.when(stuDAO.getStudent(stuVo.getStuId())).thenReturn(student); 

} 

@Test 
public void getStudent() throws DataAccessException { 
    StudentVO stVO=stuService.getStudent(123) ; 
    Assert.assertEquals("123", stVO.getStuId()); 
} 

}

我的服務類

public class StudentService { 
@Inject 
StudentDAO stuDao; 
public StudentVo getStudent(String id){ 
    return stuDao.getStudent(id); 
} 
public StudentDAO getStuDao() { 
    return stuDao; 
} 
} 

在追蹤破壞它只是顯示爲「顯示java.lang.NullPointerException

at com.stu.StudentService.getStudent(StudentService.java:104) 
at com.stu.junit.POCJunit.getgetStudent(StudentTest.java:21) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
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) 
+0

你可以包括完整的堆棧跟蹤嗎? – Mureinik 2014-11-14 15:18:46

+0

我已經粘貼了我的所有代碼和錯誤 – stackUser44 2014-11-14 20:05:00

回答

1

我通過把下面的代碼

解決它
@Mock 
StudentDAO stuDAO; 

@InjectMocks 
StudentService stuService; 

And in setUp() method I have written 

MockitoAnnotations.initMocks(this); 
1

有一些問題與您的代碼。

首先在您的模擬爲DAO。在名爲student的測試類中沒有變量。這應該可能是stuVO,除非您將其他對象轉換爲stuVO對象。無論哪種方式,變量學生將需要在該模擬中被定義或替換。

另一件事是你的輸入和輸出沒有意義。在setter中StudId爲「123」,但在assert中爲int。你可能會在setter或getter中進行轉換,但要確保你的類型在assert中匹配。

我剛剛注意到的另一件事。

你沒有在服務中設置你的模擬DAO。這是造成你的空指針,因爲你的服務正在試圖調用該我假設中自動裝配空DAO的方法。

試試這個

public class StudentTest { 
    @ObjectUnderTest 
    StudentService stuService; 
    @Inject 
    StudentDAO stuDAO; 
    StudentVO stuVo; 

    @Before 
    public void setUp() throws Exception { 
     System.out.println("In Setup"); 
     stuVo=new StudentVO(); 
     stuVo.setStudId("123"); 
     stuVo.setName("user1"); 
     Mockito.when(stuDAO.getStudent(stuVo.getStuId())).thenReturn(student); 
    } 

    @Test 
    public void getStudent() throws DataAccessException { 
     StudentVO stVO=stuService.getStudent(123) ; 
     Assert.assertEquals("123", stVO.getStuId()); 
    } 
} 
+0

嗨,感謝您的回覆,我在服務器中使用@Inject注入了DAO。 – stackUser44 2014-11-14 15:34:54

+0

好的..你有@Inject你的DAO在Test類嗎?該代碼段進去的那部分之間 – RHammonds 2014-11-14 15:36:58

+0

我的服務類 公共類StudentService { \t @Inject \t StudentDAO stuDao; \t public StudentVo getStudent(int id){ \t \t return stuDao.getStudent(id); \t} \t public StudentDAO getStuDao(){ \t \t return stuDao; \t} \t } – stackUser44 2014-11-14 19:57:58