2014-12-10 5 views
3

Я новичок в JUnit и пытаюсь протестировать весенний веб-сервис, который использует JPA DAO. Мне нужно протестировать метод обслуживания, аналогичный приведенному ниже.JUnit тестирование транзакционных методов

Метод обслуживания аннотируется с помощью метода @Transactional(propagation=Propagation.REQUIRED) и ServiceObjectRepository.update(), который вызывает собственный SQL-запрос для обновления db.

@Transactional(propagation=Propagation.REQUIRED)  
public void serviceMethod(){ 
     //Read DB for ServiceObject to update 
     //Call ServiceObjectRepository.update() method to update DB 
} 

ServiceObjectRepository

public interface ServiceObjectRepository extends JpaRepository<ServiceObject, Integer> { 

    @Query(value ="UPDATE serviceobjcet AS c SET c.objectstatus= :os WHERE c.objid = :oi", nativeQuery = true) 
    public Integer update(@Param("os")short objStatus,@Param("oi")int objId);  
} 

TestClass

@TransactionConfiguration(defaultRollback=true) 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(
     locations = "classpath:service-test.xml") 
@Transactional 
public class ServiceHandlerTest { 

    @Test 
    public void testServiceMethod() { 

     //Create ServiceObject and save to DB 
     //Call serviceMethod() 
     //Read DB for updatedServiceObject 

     assertEquals("Test: Object should be in updated state", new Short(3), updatedServiceObject.getObjectstatus(), 0); 

    } 
} 

Мои тестовые запуски и откатить БД транзакций. Но проблема в том, что когда я читаю updatedServiceObject после вызова serviceMethod, он не возвращает обновленный объект. Поэтому мой тест завершился неудачей с использованием исключения NullPointerException в assertEquals. Есть идея решить эту проблему?

ответ

2

Наконец-то я придумал решение, вместо создания ServiceObject и сохранения в БД в методе тестирования, я сделал это до метода тестирования и удаления созданных объектов, выполненных после транзакции. Так что мой тестовый класс выглядит,

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:service-test.xml") 

public class ServiceHandlerTest { 

    @Before 
    public void setup() { 
     //Create ServiceObject and save to DB 
    } 


    @Test 
    public void testServiceMethod() { 
     //Call serviceMethod() 
     //Read DB for updatedServiceObject 

     assertEquals("Test: Object should be in updated state", new Short(3), updatedServiceObject.getObjectstatus(), 0); 
    } 

    @After 
    public void teardown() { 
     //Delete created ServiceObject from DB 
    } 
} 

И я обнаружил, что метод испытания или испытания класса не обязательно быть транзакционной в таком случае.