2014-09-05 4 views
0

Можно ли проверить установку вставки/обновления в JUNIT?Весна + спящий режим/услуга dao

моя весна-servlet.xml

<context:component-scan base-package="com.isad" /> 
<mvc:annotation-driven /> 

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
<property name="prefix"> 
    <value>/WEB-INF/jsp/</value> 
</property> 
<property name="suffix"> 
    <value>.jsp</value> 
</property> 
</bean> 

<bean id="sessionFactory" scope="singleton" 
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property> 
</bean> 

<tx:annotation-driven transaction-manager="transactionManager"/> 
<bean id ="transactionManager" class = "org.springframework.orm.hibernate4.HibernateTransactionManager"> 
<property name = "sessionFactory" ref = "sessionFactory"/> 
</bean> 

Мои испытания настроить:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({"classpath:spring-servlet.xml"}) 
@TransactionConfiguration(transactionManager="transactionManager",defaultRollback=true) 
@Transactional 
public class TestItem { 

@Autowired CategoryService catManager; 

@Test 
public void testItem() { 
    //System.out.println("Begin Test"); 
    Category cat = new Category(); 
    cat.setType(CategoryType.BOOK); 
    cat.setSubCategory("Business Book"); 
    cat.setDescription("One Thing"); 
    catManager.addCategory(cat); 
} 
} 

И это stackstrace я для выполнения кода:

Hibernate: insert into CATEGORY (DESCRIPTION, SUB_CAT, CAT_TYPE) values (?, ?, ?) 
INFO | 2014-09-04 18:46:50,844 | TransactionalTestExecutionListener.java | 298 | Rolled back transaction after test execution for test context [[email protected] testClass = TestItem, testInstance = [email protected], testMethod = [email protected], testException = [null], mergedContextConfiguration = [[email protected] testClass = TestItem, locations = '{classpath:spring-servlet.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader', parent = [null]]] 
INFO | 2014-09-04 18:46:50,847 | AbstractApplicationContext.java | 873 | Closing [email protected]372afb: startup date [Thu Sep 04 18:46:48 PDT 2014]; root of context hierarchy 

Проблема У меня есть помимо вставки и обновления, другие мои методы, такие как удаления, работают нормально.

+1

Опубликовать полную трассировку стека –

ответ

1

Ваш тест прошел успешно, но поскольку это тест, и вы указали defaultRollback=true, когда метод тестирования завершен, все изменения, внесенные в вашу базу данных, были отброшены назад.

я буду считать, что в вашей службе у вас есть метод, который запускает эквивалент COUNT(*) заявления для этого Category объекта Если вы действительно хотите, чтобы проверить, если ваш Вкладыш удалось, попробуйте следующий код:

@Test 
public void testInsertItem(){ 
    int countPreInsert = catManager.count(); 

    Category cat = new Category(); 
    cat.setType(CategoryType.BOOK); 
    cat.setSubCategory("Business Book"); 
    cat.setDescription("One Thing"); 
    catManager.addCategory(cat); 

    int countPostInsert = catManager.count(); 

    assertEqual("Exactly one record was not inserted in the database", 
     countPreInsert + 1, countPostInsert) 
} 

Вам не нужно выполнять очистку, потому что TransactionalTestExecutionListener автоматически откатится от инструкции вставки при завершении теста.

Если вы хотите протестировать обновление, получите предварительное и пост-обновление count и утвердите, что оба они равны, гарантируя, что Hibernate не вставлял и не удалял никаких записей.

Счастливые испытания!

+0

Для обновления вы также можете использовать встроенный 'JdbcTemplate' и сделать' queryforMap', который дает пару ключей/значений, которую вы можете проверить с помощью утвержденных значений. Я всегда предлагаю использовать другое средство (JDBC), чтобы проверить ваши предположения, а затем тот, который вы используете (JPA/Hibernate), возможно, последний возвращает правильный результат (из-за кэширования), но он еще не синхронизирован к отсутствию установки tx. –

+0

Ahh, но Hibernate достаточно умен, чтобы думать об этом. Всякий раз, когда вы вызываете счетчик (*), Hibernate очищает базовый сеанс до базы данных, так что вы не получите устаревшее чтение. – JamesENL

+0

Теоретически, если вы начинаете возиться с флешмодами, то спящий режим уже не такой умный. –