2016-04-05 16 views
1

私は以下のクラスを削除しました(サービスインターフェイスが単純化のために単一のオーバーライドメソッドを持つとしよう)。何を試しても、ServiceImplgetSqlSession()を呼び出すと、常にNullPointerExceptionが発生します。例外を回避するには、この呼び出しをどのようにオーバーライドできますか?私はスパイServiceImplを作成し、getSqlSession()メソッドでwhenを呼び出すことを試みましたが、私はまだ例外を取得します。私はServiceImpl.getData()のロジックを入れて、List<Object>Map<String,Object>に変更してテストクラスに入れたくないので、この実装が変更されてもテストコードも変更する必要があるからです。助言がありますか?Mockito NullPointerExceptionスーパークラスメソッド呼び出しから

public class ServiceImpl extends BaseService implements Service { 

    @Autowired 
    private ServiceDAO serviceDao; 

    @Override 
    public Map<String, Object> getData() { 
     Map<String,Object> map = new HashMap<String,Object>(); 
     List<Object> resultSet = service.getData(getSqlSession()); 
     map.put("Test", resultSet.get(0)); 
     map.put("Test2", resultSet.get(1)); 

     return map; 
    } 

    public void setServiceDao(final ServiceDAO serviceDao) { 
    this.serviceDao = serviceDao; 
    } 

} 

BaseService:

public class BaseService { 

    @Autowired 
    private ApplicationContext context; 

    public SqlSession getSqlSession() { 
     return (SqlSession)context.getBean("SQL_SESSION"); 
    } 

    public void setContext(ApplicationContext context) { 
     this.context=context; 
    } 

} 

DAO

public class ServiceDAO { 
    public List<Object> getData(SqlSession sqlSession) { 
     return sqlSession.selectList("proc_name"); 
    } 
} 

とテストクラス:

public class ServiceImplTest { 

    private Service service; 

    @Mock 
    private ServiceDAO serviceDao; 

    @Before 
    public void before() { 
     MockitoAnnotations.initMocks(this); 
     service = new ServiceImpl(); 
     service.serviceDao = this.serviceDao; 
    } 

    @Test 
    public void testGetData() { 
     Mockito.when(service.getData()).then(new Answer<List<Object>>() { 

     @Override 
     public List<Object> answer(InvocationOnMock invocation) throws Throwable { 
      return serviceDAO.getData(new DefaultSqlSession(null,null)); 

     } 

    }); 

     service.getData(); 

    } 
} 
+0

@Spy注釈かもしれ –

+0

は、スパイを使用して、最後にこの作業を取得することができたことは、私はあなたが 'service.serviceDAO = this.serviceDAO意味を前提と – aarbor

+0

おかげで喜んで助ける;'と私はそれを試してみました同じように。動作しませんでした。 –

答えて

0

は最終的にテストクラス以下で、この作業を取得することができました。 Service宣言をインタフェースから実際のImplクラスに変更しなければなりませんでした。他のすべての試みがうまくいきませんので、これを回避する方法があるかどうかはわかりません。

public class ServiceImplTest { 

    @Mock 
    private ServiceDAO serviceDAO; 

    @Spy 
    private ServiceImpl service; 

    @Before 
    public void before() { 
     MockitoAnnotations.initMocks(this); 
     //service = new ServiceImpl(); 
     service.setServiceDAO(this.serviceDAO); 
    } 

    @Test 
    public void testGetData() { 
     Mockito.doAnswer(new Answer<SqlSession>(){ 

      @Override 
      public SqlSession answer(InvocationOnMock invocation) throws Throwable { 
       return new DefaultSqlSession(null,null); 
      } 

     }).when(service).getSqlSession(); 

     Mockito.when(service.getData()).then(new Answer<List<Object>>() { 

     @Override 
     public List<Object> answer(InvocationOnMock invocation) throws Throwable { 
      return serviceDAO.getData(new DefaultSqlSession(null,null)); 

     } 

    }); 

     service.getData(); 

    } 

} 
0

私はあなたがserviceDaoを使用しようとするとエラーが発生したと考えていますあなたのサービスから:

List<Object> resultSet = service.getData(getSqlSession()); 

あなたが同じパッケージ内にある場合は、あなたのサービス内の嘲笑serviceDAOを注入する必要があります。

@Before 
public void before() { 
    MockitoAnnotations.initMocks(this); 
    service = new ServiceImpl(); 
    service.service = this.serviceDAO; 
} 
+0

を助けたおかげ – aarbor

+0

私はあなたのServiceImpl内で "service.service"を意味しませんでした.Daoは "サービス"と呼ばれ、このクラスはnullだと思いますか?あなたは例外をどこで正確に得ますか? –

+0

申し訳ありませんが、あなたは正しいです。上記のコードを編集して明示し、変更を加えました(私が試したことを示すため)。私にとってはまだ例外が発生しています。私は 'service.getData(getSqlSession())'の呼び出し時に、毎回あなたがどこにいるのか例外を取得しています。 – aarbor

関連する問題