JUnitで次のDAOをテストします。
@Repository
public class MyDao {
@Autowired
private SessionFactory sessionFactory;
// Other stuff here
}
ご覧のとおり、sessionFactoryはSpringを使用して自動接続されています。テストを実行すると、sessionFactoryはnullのままになり、nullポインター例外が発生します。
これは、Springの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>
どうしましたか?単体テストでも自動配線を有効にするにはどうすればよいですか?
更新:JUnitテストを実行する唯一の方法であるかどうかはわかりませんが、テストファイルを右クリックして「実行」->「JUnitテスト」を選択してEclipseで実行していることに注意してください
次のようなものをルートユニットテストクラスに追加します。
@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration
これにより、デフォルトパスのXMLが使用されます。デフォルト以外のパスを指定する必要がある場合は、ContextConfigurationアノテーションにロケーションプロパティを指定できます。
http://static.springsource.org/spring/docs/2.5.6/reference/testing.html
コンテキストからSpring Beanをワイヤリングするには、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およびHibernate 3.6.5
構成にコンテキストファイルの場所がないと、これが発生する可能性があります。これを解決する1つの方法は次のとおりです。
好む:
@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に感謝
Spring Boot 2.1.1とJUnit 4でも同じ問題が発生しました
これらの注釈を追加しました:
@RunWith( SpringRunner.class )
@SpringBootTest
そしてすべてがうまくいった。
Junit 5の場合:
@ExtendWith(SpringExtension.class)
Junitクラスに注釈を追加して、SpringJunitRunnerを使用するように指示する必要があります。必要なものは次のとおりです。
@ContextConfiguration("/test-context.xml")
@RunWith(SpringJUnit4ClassRunner.class)
これは、テストと同じディレクトリにあるtest-context.xmlファイルを使用するようにJunitに指示します。このファイルは、春に使用している実際のcontext.xmlに似ている必要がありますが、当然、テストリソースを指します。