0

休止状態プロセスをテストするための単体テストがあります。これを実行させてください

以下は私のAbstractDAOです

public abstract class BaseDAO {

    protected JdbcTemplate jdbcTemplate;
    protected SessionFactory sessionFactory;
    protected NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    ...

    @Autowired
    public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
        this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
    }

    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
}

これが私のconcreteDAOであり、BaseDAOを拡張します

public class LoginDAO extends BaseDAO implements InitializingBean {

    private static final Logger log = Logger.getLogger(LoginDAO.class);
    private MD5PasswordEncoder passwordEncoder;
    private SaltSource saltSource;

    public User getLoggedinUserByUserid(Long userid){
        log.info("in getLoggedinUserByUserid"); 
        User result = null;
        Session session = sessionFactory.openSession();

        try {
            session.beginTransaction();

            result = (User) session.get(User.class, userid);

            session.getTransaction().rollback();
            session.close();

        } catch (Exception e) {
            log.error(e,e);

            session.getTransaction().rollback();
            session.close();
        }

        return result;
    }

...
}

これが私のジュニットです

@Test
public void shouldReturnCorrectlyUserWhenCallingGetLoggedinUserByUseridMethod() {

    // Given When
    User adminUser = loginDAO.getLoggedinUserByUserid(1l);

    // Then
    assertNotNull(adminUser);
    assertEquals("sadmin", adminUser.getUsername());
    assertEquals("ecedee8662a0bcd15c157e5734056ac5", adminUser.getPassword());
    assertEquals(1, adminUser.getStatus());
    assertEquals("TS", adminUser.getFirstname());
    assertEquals("Sys Admin Person", adminUser.getLastname());
    assertEquals(0, adminUser.getIdType());
    assertTrue(adminUser.getEnabled());
    assertTrue(adminUser.getAuthenLocal());
    assertTrue(StringUtils.isBlank(adminUser.getTitle()));
}

SessionFactory は BaseDAO に問題なく注入されましたが Session session = sessionFactory.openSession();LoginDAOそれが入ると null になりました!

これはどのように起こりますか?説明が必要で、この問題を解決するにはどうすればよいですか?

4

1 に答える 1

0

これらのテストが統合テストでない限り、実際のオブジェクトでテストすることは本当に悪い習慣です。そのためのモック オブジェクトがあります。jmockEasyMockMockitoは、検索すれば見つかる最高の Java ライブラリです。

おそらく、MVC パターンの View 部分に対して OpenSessionInView のようなものを使用して、JPA または Hibernate Session を検索しようとすることができます。それは次のようなものかもしれません:

public abstract class AppContextTestCase extends TestCase {

    protected FileSystemXmlApplicationContext context = null;
    protected SessionFactory sessionFactory = null;

    /* (non-Javadoc)
     * @see junit.framework.TestCase#setUp()
     */
    protected void setUp() throws Exception {
        super.setUp();
        String[] contextLocations = new String[2];
        contextLocations[0] = "web/WEB-INF/applicationContext.xml";
        contextLocations[1] = "test/dataSource-local.xml";
        context = new FileSystemXmlApplicationContext(contextLocations);
        sessionFactory = (SessionFactory) context.getBean("sessionFactory");
        Session session = SessionFactoryUtils.getSession(sessionFactory, true);
        TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));
    }

    /* (non-Javadoc)
     * @see junit.framework.TestCase#tearDown()
     */
    protected void tearDown() throws Exception {
        SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);
        SessionFactoryUtils.closeSessionIfNecessary(sessionHolder.getSession(), sessionFactory);
        context = null;
        super.tearDown();
    }
}

または、次のようなことを行います。

protected void setUp() throws Exception {    
    Session session = SessionFactoryUtils.getSession(sessionFactory, true);
    TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));
}

protected void tearDown() throws Exception {
    SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);
    SessionFactoryUtils.closeSessionIfNecessary(sessionHolder.getSession(), sessionFactory);
}
于 2012-08-28T10:23:58.857 に答える