您好我正在尝试对我正在使用Dao和事务管理器类的服务类进行单元测试.Dao和Transacion Manager类都是单例。我试图在每个类中使用静态setInstance方法创建这些类的模拟对象,然后通过getInstance方法获取对象。 我能够为事务管理器类做到这一点,但我无法为Dao做到这一点。
public class MusicPlayerDaoImpl implements MusicPlayerDao{
private static MusicPlayerDaoImpl musicPlayerDao;
public static MusicPlayerDaoImpl getInstance(){
if(musicPlayerDao==null){
synchronized (MusicPlayerDaoImpl.class) {
if(musicPlayerDao==null){
musicPlayerDao = new MusicPlayerDaoImpl();
}
}
musicPlayerDao = new MusicPlayerDaoImpl();
}
System.out.println("inside get instance of musicPlayerDao class"+musicPlayerDao);
return musicPlayerDao;
}
public static void setInstance(MusicPlayerDaoImpl dao){
System.out.println("inside set instance of MusicPlayerDaoImpl");
musicPlayerDao = dao;
}
//methods to perform db operations.
}
这个setInstance方法不适用于Dao类。它适用于transactionmanager类。 公共类TransactionManagerImpl实现TransactionManager {
private static ThreadLocal<Transaction> threadLocal = new ThreadLocal<Transaction>();
private static TransactionManagerImpl transactionManager;
public static TransactionManagerImpl getInstance(){
if(transactionManager==null){
synchronized (TransactionManagerImpl.class) {
if(transactionManager==null){
transactionManager = new TransactionManagerImpl();
}
}
transactionManager = new TransactionManagerImpl();
}
System.out.println("inside get instance of transaction manager class"+transactionManager);
return transactionManager;
}
public static void setInstance(TransactionManagerImpl manager){
System.out.println("inside set instance of transaction manager");
transactionManager = manager;
}
//methods like begin,commit,rollback
}
我的考试班: @RunWith(PowerMockRunner.class) @PrepareForTest(MusicPlayerDaoImpl.class) 公共类MusicPlayerServiceTest {
private MusicPlayerDaoImpl dao;
private MusicPlayerServiceImpl service;
private TransactionManagerImpl transactionManager;
@Before
public void setUp() throws SQLException, NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException {
this.service = MusicPlayerServiceImpl.getInstance();
suppressConstructor(MusicPlayerDaoImpl.class);
mockStatic(MusicPlayerDaoImpl.class);
suppressConstructor(TransactionManagerImpl.class);
mockStatic(TransactionManagerImpl.class);
this.dao = createMock(MusicPlayerDaoImpl.class);
this.transactionManager = createMock(TransactionManagerImpl.class);
MusicPlayerDaoImpl.setInstance(this.Dao);
TransactionManagerImpl.setInstance(this.transactionManager);
Song song = new Song();
Album album = new Album();
Genre genre = new Genre();
album.setAlbumName("i hate luv storys");
genre.setGenreName("bollywood");
song.setTitle("Bahara");
song.setRating(4);
song.setAlbum(album);
song.setGenre(genre);
EasyMock.expect(this.dao.getSong("Bahara")).andReturn(song);
EasyMock.replay(this.dao);
this.transactionManager.begin();
EasyMock.expectLastCall();
this.transactionManager.commit();
EasyMock.expectLastCall();
this.transactionManager.rollback();
EasyMock.expectLastCall();
EasyMock.replay(transactionManager);
}
@Test
public void getSongTest() throws SQLException, IllegalStateException,
SecurityException, SystemException {
String title = "Bahara";
Song returnSong = this.service.getSong(title);
System.out.println("Return song:----->"+returnSong.getAlbum().getAlbumName());
assertTrue(returnSong.getTitle() == title);
}
}
我得到一个空指针异常,说dao对象为null。我没有得到我出错的地方。请帮忙。