单例模拟对象未在setInstance方法中设置

时间:2014-11-07 06:25:02

标签: java unit-testing singleton easymock

您好我正在尝试对我正在使用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。我没有得到我出错的地方。请帮忙。

0 个答案:

没有答案