Модульное тестирование с помощью unitils, dbunit и spring
Я новичок в унитилах (встроенных в дбунит) и в пружине. На новом месте, где я работаю, я вижу, что некоторые тесты проводятся с пружиной, а другие используют unitils/dbunit без пружины.
Есть толчок для использования пружины, поэтому я пытался объединить следующие функции.
Весенние тесты с использованием:
@RunWith(SpringJUnit4ClassRunner.class )
@ContextConfiguration(locations = { "classpath:spring-dev.xml" })
public class x(){
@Autowired
private ProfileDao profileDao;
@Test
@Rollback
@Transactional
public void shouldRetrieveProfileByUserNumber() {
Profile profile = profileDao.retrieveProfile("u1", "0000003861", null);
assertThat(profile.getUserNumber(), is("0000003861"));
}
Этот класс имеет @Autowired ProfileDao, который работает при использовании @RunWith(SpringJUnit4ClassRunner.class).
Тесты Unitils с использованием:
@RunWith(UnitilsJUnit4TestClassRunner.class)
@DataSet("WEB_SERVICE_DATASET.xml")
public class ServiceExceptionTest {}
Который правильно загружает базу данных и т. Д. При запуске.
Я пытаюсь добиться того, чтобы объединить их, чтобы я мог "Unitil'ise" мой класс с аннотацией @RunWith(UnitilsJUnit4TestClassRunner.class), но также использовал пружину обычным способом, как в предыдущем классе.
Проблема в том, что я не могу унифицировать мой класс при использовании весенней версии, поскольку они оба являются расширениями JUnit4ClassRunner.
Я пробовал разные варианты, но не смог заставить их работать.
Кто-нибудь может посоветовать достойный способ сделать это?
Спасибо
2 ответа
У Unitils на самом деле нет надлежащей поддержки интеграции с Spring.
Взгляните на spring-test-dbunit.
Unitils имеет пакет интеграции Spring:
org.unitils:unitils-spring:3.3
Нам не пришлось переходить с тестов Spring, но мы используем Spring и Unitils вместе. Вместо того, чтобы использовать аннотацию @RunWith, мы создаем подкласс:
import org.unitils.UnitilsJUnit4;
import org.unitils.dbunit.annotation.DataSet;
import org.unitils.spring.annotation.SpringBean;
import org.unitils.spring.annotation.SpringApplicationContext;
@SpringApplicationContext({"main-context.xml", "test-context.xml"})
@DataSet
public class ServiceTest extends UnitilsJUnit4 {
@SpringBean("ourServiceBean")
OurService ourService;
@Test
public void someTest() throws Exception {
}
}
Недавно мы столкнулись с проблемой, когда наши тестовые данные не загружались должным образом с первого раза. Это может быть конфликт между обработкой транзакций Unitils и Spring. Я не совсем уверен, но отключаю транзакции в Unitils, установив это свойство:
DatabaseModule.Transactional.value.default=disabled
в файле unitils.properties обошли проблему.