Подтвердить что ты не робот

Как поле 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?

4b9b3361

Ответ 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);, поэтому вы не будете зависеть от класса/метода, который вы также должны тестировать отдельно.