package com.manning.hsia.dvdstore.test; import java.lang.reflect.Proxy; import java.util.List; import org.hibernate.Hibernate; import org.hibernate.Transaction; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; import org.testng.annotations.Test; import com.manning.hsia.dvdstore.action.SearchingAction; import com.manning.hsia.dvdstore.action.SearchingActionImpl; import com.manning.hsia.dvdstore.model.Item; import com.manning.hsia.dvdstore.util.SessionInvocationHandler; import com.manning.hsia.dvdstore.util.TestCase; public class SearchingActionTest extends TestCase { @Test(groups="ch09") public void testTargetedQuery() throws Exception { SearchingAction action = getSearchingAction(); List<Item> results = action.getMatchingItems("season", 1); assert results.size() == 20 : "Found " + results.size(); } @Test(groups="ch09") public void testFetchingStrategy() throws Exception { SearchingAction action = getSearchingAction(); List<Item> results = action.getMatchingItemsWithDistributor("season", 1); assert results.size() == 20 : "Found " + results.size(); assert Hibernate.isInitialized( results.get(0).getDistributor() ); } @Test(groups="ch09") public void testProjection() throws Exception { SearchingAction action = getSearchingAction(); List<String> results = action.getTitleFromMatchingItems("season"); assert results.size() == 21 : "Found " + results.size(); } @Override public void postSetUp() throws Exception { FullTextSession session = Search.getFullTextSession( factory.openSession() ); Transaction tx = null; try { tx = session.beginTransaction(); //manual indexing solution OK for small amounts of data List<?> results = session.createCriteria( Item.class ).list(); for (Object entity : results) { session.index( entity ); //index each element } //commit the index changes tx.commit(); } finally { session.close(); } } private SearchingAction getSearchingAction() { SearchingAction action = new SearchingActionImpl(); return (SearchingAction) Proxy.newProxyInstance( this.getClass().getClassLoader(), new Class[] { SearchingAction.class }, new SessionInvocationHandler(action, factory) ); } }