2017-02-28 31 views
0

我想爲下面代碼中顯示的方法編寫一些測試。我正在嘲笑JMockit的依賴關係。無論出於何種原因,我總是得到一個NullPointerException,我真的不明白爲什麼會發生這種情況。我是JMockit的新手,並且一般嘲笑依賴關係。堆棧跟蹤僅顯示在new NonStrictExpectations() 處拋出的NullPointerException。當模擬控制器類時出現NullPointerException

方法測試

@Override 
public boolean addSubject(User user, Schedule schedule, SchoolSubject subject) { 
    final boolean result = schedule.addSubject(subject.getHourTime(), subject); 
    scheduleDAO.update(schedule); 
    if (subject.getTeacher() != null && !subject.getTeacher().trim().isEmpty()) { 
     for (final TeacherEntry teacher : user.getTeachers()) { 
      if (subject.getTeacher().equals(teacher.getName())) { 
       teacher.getSubjects().add(subject.getName()); 
       teacherDAO.update(teacher); 
      } 
     } 
    } 
    try { 
     userDAO.update(user); 
    } catch (final DuplicateUniqueFieldException e) { 
     throw new UnexpectedUniqueViolationException(e); 
    } 
} 

測試方法:

//imports not copied 
public class ScheduleManagerTest { 

@Tested 
ScheduleManager manager; 

@Injectable 
UserDAO userDAO; 

@Injectable 
ScheduleDAO scheduleDAO; 

@Injectable 
TeacherEntryDAO teacherDAO; 

@Injectable 
SchoolSubjectDAO schoolSubjectDAO; 

@Mocked 
Schedule schedule; 

@Mocked 
SchoolSubject subject; 

@Mocked 
User user; 

@Test 
public void testAddSubject() throws DuplicateUsernameException, DuplicateEmailException { 

    new NonStrictExpectations() { 

     { 
      schedule.addSubject(anyInt, (SchoolSubject) any); 
      result = true; 
      scheduleDAO.update((Schedule) any); 
      subject.getTeacher(); 
      result = anyString; 
      subject.getTeacher().trim().isEmpty(); 
      result = false; 
      user.getTeachers(); 
      result = (ArrayList<TeacherEntry>) any; 
      teacherDAO.update(((TeacherEntry) any)); 
      userDAO.update((User) any); 
     }; 
    }; 

    assertTrue(manager.addSubject(user, schedule, subject)); 

    } 
} 

我覺得我做的事情非常錯誤的:(

+0

嗯...我看到許多錯誤和不良行爲的嘲諷(容易計算一打),無論是在生產代碼(例如,一致地使用'final',不必返回'boolean')和測試代碼中(例如,不要在JUnit 4測試中使用「test」前綴,在測試方法中使用'throws Exception') 。所以,我的理解是閱讀編程書籍,學習語言和習慣用法,也許不會嘗試使用高級工具(一個嘲諷庫),直到你獲得更多的知識和經驗。可能不是你想聽到的,但它是最有用的建議... –

回答

0

很難知道什麼是基於說明會錯,但這裏有一個猜測:

嘲笑的對象將在默認情況下在他們的方法返回null。你會在這裏得到一個空指針:

subject.getTeacher().trim() 

因爲getTeacher()將返回null。要返回一個老師,你必須要麼使用一個真正的主題還是進一步

Mockito.when(subject.getTeacher()).thenReturn(new Teacher()); 
+0

sry爲我的不好的描述。我看到這似乎是問題所在。我的測試不被npe謝謝你打斷。我有一個問題可以混合jmockit和mockito嗎? – Dos

0

您需要添加@RunWith(JMockit.class)到你的班級

@RunWith(JMockit.class) 
public class ScheduleManagerTest { 

... 
+0

剛剛嘗試過,但這不會解決它。集成測試不是'@ RunWith'註釋嗎?我想單獨測試我的類作爲一個組件,這就是爲什麼我試圖嘲笑它的依賴關係。 :) – Dos

+0

確保您遵循本指南中的前三個步驟。 http://jmockit.org/gettingStarted.html – alayor

相關問題