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

Spring не автоувеличивание в модульных тестах с помощью JUnit

Я тестирую следующий DAO с помощью JUnit:

@Repository
public class MyDao {

    @Autowired
    private SessionFactory sessionFactory;

    // Other stuff here

}

Как вы можете видеть, sessionFactory автоматически поддерживается с помощью Spring. Когда я запускаю тест, sessionFactory остается равным null, и я получаю исключение с нулевым указателем.

Это конфигурация sessionFactory в Spring:

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property>
    <property name="configurationClass">
        <value>org.hibernate.cfg.AnnotationConfiguration</value>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${jdbc.dialect}</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

Что случилось? Как включить автоувеличивание для единичных тестов?

Обновление: я не знаю, является ли это единственным способом запуска тестов JUnit, но обратите внимание, что я запускаю его в Eclipse, щелкнув правой кнопкой мыши на тестовом файле и выбрав "run as" → "JUnit test",

4b9b3361

Ответ 1

Добавьте что-то вроде этого в свой корневой класс unit test:

@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration

Это будет использовать XML в вашем пути по умолчанию. Если вам нужно указать путь по умолчанию, то вы можете указать свойство location в аннотации ContextConfiguration.

http://static.springsource.org/spring/docs/2.5.6/reference/testing.html

Ответ 2

Вам нужно использовать бегун для Spring JUnit для подключения в Spring beans из вашего контекста. В приведенном ниже коде предполагается, что у вас есть контекст приложения с именем testContest.xml, доступный в тестовом пути.

import org.hibernate.SessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

import java.sql.SQLException;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.startsWith;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:**/testContext.xml"})
@Transactional
public class someDaoTest {

    @Autowired
    protected SessionFactory sessionFactory;

    @Test
    public void testDBSourceIsCorrect() throws SQLException {
        String databaseProductName = sessionFactory.getCurrentSession()
                .connection()
                .getMetaData()
                .getDatabaseProductName();
        assertThat("Test container is pointing at the wrong DB.", databaseProductName, startsWith("HSQL"));
    }
}

Примечание.. Это работает с Spring 2.5.2 и Hibernate 3.6.5

Ответ 3

Отсутствие местоположения контекстного файла в конфигурации может вызвать это, один из способов решения этой проблемы:

  • Указание местоположения контекстного файла в ContextConfiguration

как:

@ContextConfiguration(locations = { "classpath:META-INF/your-spring-context.xml" })

Подробнее

@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration(locations = { "classpath:META-INF/your-spring-context.xml" })
public class UserServiceTest extends AbstractJUnit4SpringContextTests {}

Ссылка: Благодаря @Xstian

Ответ 4

Вам нужно добавить аннотации к классу Junit, сообщая ему использовать SpringJunitRunner. Те, которые вы хотите:

@ContextConfiguration("/test-context.xml")
@RunWith(SpringJUnit4ClassRunner.class)

Это говорит Junit использовать файл test-context.xml в том же каталоге, что и ваш тест. Этот файл должен быть похож на реальный context.xml, который вы используете для spring, но, естественно, указывая на тестовые ресурсы.

Ответ 5

У меня была такая же проблема с Spring Boot 2.1.1 и JUnit 4
только что добавил эти аннотации:

@RunWith( SpringRunner.class )
@SpringBootTest

и все прошло хорошо.

Для Junit 5:

@ExtendWith(SpringExtension.class)

источник