2017-02-28 3 views
0

以下のコードに示すメソッドに対していくつかのテストを書きたいと思っていました。私はJMockitとの依存関係を嘲笑しています。何らかの理由で私はいつもNullPointerExceptionを取得しています。なぜそれが起こるのか本当に分かりません。私はJMockitには新しく、一般的な依存関係を嘲笑しています。スタックトレースは、行new NonStrictExpectations() でスローされたNullPointerExceptionを示しています。をテストするNockPointerExceptionがコントローラのクラスを模倣しているとき

方法:

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

    } 
} 

私はあなたがに@RunWith(JMockit.class)を追加する必要があります私はかなり間違って何か:(

+0

をからかっんでしょうJUnit 4テストでは "test"プレフィックスを使わない、テストメソッドでは 'throws Exception'を使うなど)、テストコードでは(例えば' final'を一貫して使用し、不必要に 'boolean'を返しません) 。ですから、プログラミングの本を読んで、その言語やそのイディオムを研究し、もっと知識と経験を得るまで、高度なツール(模擬図書館)を使わないようにしてください。あなたが聞きたかったものではないかもしれませんが、それは最も有用なアドバイスです... –

答えて

0

それは説明に基づいて間違って何が起こっているかを知るのは難しいですが、ここの推測です:

嘲笑のオブジェクトは、デフォルトではそのメソッドにnullを返します。ここでnullポインタを取得します。

subject.getTeacher().trim() 

getTeacher()はnullを返すためです。教師を返すには、うーん...私は間違いや悪い習慣の多くは両方の生産に(簡単にそれらのダースを数える)を参照してください本当の主題を使用するか、またはさらに

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

私の悪い記述のためにsry。私はそれが問題であるように見えます。私のテストはnpeによって中断されていない、ありがとう。 jmockitとmockitoを混在させることが可能かどうかという疑問が1つあります。 – Dos

0

をやっていると思いますあなたのクラス

@RunWith(JMockit.class) 
public class ScheduleManagerTest { 

... 
+0

それを試しましたが、これは修正されません。統合テストのための '@ RunWith'アノテーションはありませんか?私はクラスだけをコンポーネントとしてテストしたいので、それは私が依存関係を模倣しようとしているからです。 :) – Dos

+0

このガイドの最初の3つの手順に従っていることを確認してください。 http://jmockit.org/gettingStarted.html – alayor

関連する問題