it-swarm.dev

الربيع لا autowiring في اختبارات وحدة مع JUnit

أنا اختبار DAO التالية مع JUnit:

@Repository
public class MyDao {

    @Autowired
    private SessionFactory sessionFactory;

    // Other stuff here

}

كما ترون ، فإن sessionFactory هو autowired باستخدام Spring. عندما أقوم بإجراء الاختبار ، تظل sessionFactory خالية ولا أحصل على استثناء مؤشر فارغ.

هذا هو التكوين sessionFactory في الربيع:

<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>

ماذا دهاك؟ كيف يمكنني تمكين autowiring للاختبارات وحدة أيضا؟

تحديث: لا أعرف ما إذا كانت هذه هي الطريقة الوحيدة لإجراء اختبارات JUnit ، لكن لاحظ أنني أقوم بتشغيلها في Eclipse بالنقر بزر الماوس الأيمن على ملف الاختبار وتحديد "تشغيل كـ" -> "اختبار JUnit"

38
user1883212

أضف شيئًا كهذا إلى فئة اختبار وحدة الجذر:

@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration

سيستخدم هذا XML في المسار الافتراضي الخاص بك. إذا كنت بحاجة إلى تحديد مسار غير افتراضي ، فيمكنك توفير خاصية مواقع للتعليق التوضيحي لـ ContextConfiguration.

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

29
robert_difalco

تحتاج إلى استخدام عداء Spring JUnit من أجل توصيل حبوب الربيع من سياقك. تفترض التعليمة البرمجية أدناه أن لديك سياق تطبيق يسمى 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 و السبات 3.6.5

8
Mike Rylander

يمكن أن يؤدي موقع ملف السياق المفقود في التكوين إلى حل واحد لحل هذه المشكلة:

  • تحديد موقع ملف السياق في 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

6
Abhijeet

واجهت نفس المشكلة مع Spring Boot 2.1.1 و JUnit 4
أضاف للتو تلك التعليقات التوضيحية:

@RunWith( SpringRunner.class )
@SpringBootTest

وذهب كل شيء على ما يرام.

في Junit 5:

@ExtendWith(SpringExtension.class)

المصدر

3
Mcin

تحتاج إلى إضافة تعليقات توضيحية إلى فئة Junit ، مع إخبارها باستخدام SpringJunitRunner. تلك التي تريدها هي:

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

هذا يخبر Junit باستخدام ملف test-context.xml في نفس الدليل كاختبار. يجب أن يكون هذا الملف مشابهًا للسياق الحقيقي. xml الذي تستخدمه في فصل الربيع ، ولكن يشير إلى اختبار الموارد ، بشكل طبيعي.

2
TrueDub