web-dev-qa-db-ja.com

Spring @ContextConfiguration

次のテストを実行しています:

import static org.junit.Assert.assertEquals;

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;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/META-INF/spring/applicationContext.xml" })
public class FloorServiceTest {

    @Autowired
    private FloorService floorService;

    @Test
    public void testFloorService() {

        floorService.findById((long)1);

    }
}

ファイル付きapplicationContext.xmlフォルダの下/APP/src/main/resources/META-INF/spring/

しかし、Beanを正しく自動配線していないようです。

  org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.confloorapp.services.FloorServiceTest': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.confloorapp.services.FloorService com.confloorapp.services.FloorServiceTest.floorService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.confloorapp.services.FloorService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
8
darkZone

試してみてください

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

正直なところ、私はxmlから離れて、このルートに行きます。変化する

@ContextConfiguration(locations = { "/META-INF/spring/applicationContext.xml" })

@ContextConfiguration(classes = { FloorServiceTestConfig.class })

そして、aboutクラスを作成します

@Configuration
public class FloorServiceTestConfig
{
    @Bean
    public FloorService floorService()
    {
          return new FloorService();
    }
}

このように、テストしていないクラスのBeanをモックする必要がある場合は、次のようになります。

@Configuration
public class FloorServiceTestConfig
{
    @Bean
    public FloorService floorService()
    {
          return Mockito.mock(FloorService.class);
    }
}
13
ndrone

上記の_@Configuration_のアイデアはうまく機能します。ただし、そのためには、クラスに_@Configuration_アノテーションを付ける必要があります。これは、オフラインでのテストに関しては良い考えではありません。つまり、組織内でテストケースがビルド時に実行されない場合です。その場合、@ContextConfiguration(locations = { "classpath:/META-INF/spring/applicationContext.xml" })を使用するのは良い考えです。

この方法を使用するには、次の点に注意してください。

  1. プロジェクトの_.classpath_ファイルでクラスパスを確認してください。

  2. クラスパスを基準にしてapplicationContextのパスを記述できない場合。

applicationContextTestフォルダーとしてもう1つのファイルをテストケースフォルダーに保存してから、@ContextConfiguration(locations = { "classpath:applicationContextTest.xml"})を使用できます。

1
Shweta Gulati

あなたの場合、あなたは使うべきです:

@ContextConfiguration(locations = "file:src/main/resources/META-INF/spring/applicationContext.xml")

もう1つのヒントとして、テスト環境で本番環境のapplicationContext.xmlを使用しているようですが、これは良い習慣ではありません。applicationContext-test.xmlのような特定のテスト環境を使用してみてください。そうすれば、テストコンテキストを使わずに試すことができます。実稼働環境を傷つけます。

0
O.Badr