私は以下のクラスを削除しました(サービスインターフェイスが単純化のために単一のオーバーライドメソッドを持つとしよう)。何を試しても、ServiceImpl
がgetSqlSession()
を呼び出すと、常に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();
}
}
@Spy注釈かもしれ –
は、スパイを使用して、最後にこの作業を取得することができたことは、私はあなたが 'service.serviceDAO = this.serviceDAO意味を前提と – aarbor
おかげで喜んで助ける;'と私はそれを試してみました同じように。動作しませんでした。 –