Как поле autowire в статическом @BeforeClass?
@RunWith(SpringJUnit4ClassRunner.class)
public void ITest {
@Autowired
private EntityRepository dao;
@BeforeClass
public static void init() {
dao.save(initialEntity); //not possible as field is not static
}
}
Как я могу настроить свою службу уже в статическом классе init?
Ответы
Ответ 1
Мне кажется, что вы пытаетесь заполнить БД перед тестами.
Я бы попробовал два варианта:
- Если вы можете извлечь исходные скрипты в sql файл (если это опция для вас без использования репозитория bean), вы можете использовать этот подход и аннотировать ваш тест с помощью
@Sql
- Вы можете исследовать DbUnit и здесь ссылка на spring dbunit, который делает именно это и помогает вам заполнять БД перед тестированием. Ниже приведена ссылка github для интеграции между тестовой структурой spring и dbunit. После этого у вас есть
@DatabaseSetup
и @DatabaseTearDown
, которые будут делать вещи в БД, вам нужно
Я знаю, что это не отвечает, как вставлять bean в static @BeforeClass
, но формировать код, который, по-видимому, решает вашу проблему.
Update:
Недавно я столкнулся с той же проблемой в своем проекте и выкопал эту статью, которая мне помогла, и я думаю, что это элегантный способ справиться с этим типом проблемы, Вы можете расширить SpringJUnit4ClassRunner
с помощью прослушивателя, который может выполнить настройку уровня экземпляра со всеми вашими определенными beans.
Ответ 2
Одним из способов обхода, который я использовал для получения этой работы, является использование @Before
с флагом для пропуска его выполнения для каждого тестового файла
@RunWith(SpringJUnit4ClassRunner.class)
public class BaseTest {
@Autowired
private Service1 service1;
@Autowired
private Service2 service2;
private static boolean dataLoaded = false;
@Before
public void setUp() throws Exception {
if (!dataLoaded) {
service1.something();
service2.somethingElse();
dataLoaded = true;
}
}
}
Ответ 3
Чтобы ответить на этот вопрос, мы должны указать Spring 2.x.
Если вы хотите "autowire" bean в вашем классе @BeforeTest
, вы можете использовать интерфейс ApplicationContext
. Рассмотрим пример:
@BeforeClass
public static void init() {
ApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");
EntityRepository dao2 = (EntityRepository) context.getBean("dao");
List<EntityRepository> all = dao2.getAll();
Assert.assertNotNull(all);
}
Что происходит: используя ClassPathXmlApplicationContext
, мы создаем все beans, содержащиеся в файле application-context.xml
.
С context.getBean()
мы читаем указанный bean (он должен совпадать с именем bean!); а затем вы можете использовать его для вашей инициализации.
Вы должны указать bean другое имя (то, что dao2
!), в противном случае Spring обычный "autowired" не может работать с предопределенным bean.
В качестве побочного примечания, если ваш тест продолжается AbstractTransactionalJUnit4SpringContextTests
, вы можете выполнить некоторую инициализацию с помощью executeSqlScript(sqlResourcePath, continueOnError)
;, поэтому вы не будете зависеть от класса/метода, который вы также должны тестировать отдельно.