1

IllegalStateExceptionMyBatis-SpringプロジェクトをJUnitテストしようとするとスローされます。

問題は、 MyBatis Mapper Beansの自動配線にあるようです(MyBatis-Spring-JUnitのセットアップ全体に慣れていないので、専門用語はご容赦ください)。私は他の誰かからセットアップを継承しました。他に役立つ情報があれば教えてください。

以下に説明するセットアップは、すべてをWebサービスとして公開するときに機能します。しかし、JUnitでテストしようとすると失敗します。テスト中にマッパーを自動配線するにはどうすればよいですか?

設定

main/javaの下

  • 永続性フォルダー:ProductMapper.java
  • サービスフォルダ:ProductService.java
  • wsフォルダー:BrowserService.java
  • ws / implフォルダー:BrowserServiceImpl.java

メイン/リソースの下

  • 永続性フォルダー:ProductMapper.xml

BrowserService.java

class BrowserServiceImpl {

    private ProductService productService;

    // setters and getters
    // Methods
}

ProductService.java

class ProductService {

    @Autowired
    private ProductMapper productMapper;

    // Methods
}

Context.xml

<beans>
    <bean id="browserSvc" class="com.comp.team.proj.ws.impl.BrowserServiceImpl">
        <property name="productService" ref="productService" />
    </bean>

    <!-- MyBatis Config -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.comp.team.proj.persistence" />
        <property name="annotationClass" value="org.springframework.stereotype.Repository"/>
    </bean>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
        <property name="url" value="jdbc:oracle:thin:@xxx.xxx.xxx.com:xxxx:xxx"/>
        <property name="username" value="myusername"/>
        <property name="password" value="mypassword"/>
    </bean>

    <!-- Other beans -->
</beans>

例外がどのように見えるか知りたい場合:

java.lang.IllegalStateException: Failed to load ApplicationContext
...
Caused by: org.springframework.beans.factory.BeanCreationException: 
  Could not autowire field: private com.comp.team.proj.persistence.ProductMapper 
    com.comp.team.proj.service.ProductService.productMapper;

nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
  No matching bean of type [com.comp.team.proj.persistence.ProductMapper]
    found for dependency:
       expected at least 1 bean which qualifies as autowire candidate for this 
       dependency.
...

編集

上記の更新のdataSourceBeanを参照してくださいContext.xml。構成は正しいように見えますか?

1つの問題はdataSourceの設定にあるようです。JUnitテストが実行されるため、この仮定を行いますが、例外がスローされます。したがって、JUnitのセットアップではない可能性があります。dataSourceの設定が正しい場合、MyBatisはマッパーBeanを正常にインスタンス化し、自動配線は成功します。

テストファイル

@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class ProductCountTest {

    @Autowired
    protected BrowserService browserSvc;

    @Test
    public void testGetProductCount() {
        long count = browserSvc.getProductCount();

        assertTrue(count > 0);
    }

}

Context.xml正しいディレクトリに配置したので、問題なくファイルが見つかります。

4

2 に答える 2

1

ユニットテストのコードを教えてください。

スプリング構成が欠けていると思います

@ContextConfiguration(locations = { 
        "classpath:/com/comp/team/proj/context.xml" // give the correct path 
        })
@RunWith(SpringJUnit4ClassRunner.class)
public class BrowserServiceTest {

@Autowired
BrowserServiceImpl browserService;

@Test
public void shouldTestSmth(){

}

テスト中、Springはspring-testlibを使用することを忘れないでください。

編集: 私は最も重要な部分がまだ表示されていないと思います。context.xmlにProductMapperのBean定義がありますか?私はそれが欠けていると思います。

また、アノテーションとBean定義が混在していることもわかります。たぶんあなたは豆の定義が必要ですか?

于 2012-10-30T07:03:10.230 に答える
0

ここでデータソース構成を修正します。

マッピングBeanを実行する別の方法があることを発見しました:

<bean id="productMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
  <property name="mapperInterface" value="com.comp.team.proj.persistence.ProductMapper" />
  <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>


私はIllegalStateExceptionが投げられたと思います:

データソースが正しく構成されていなかったため、マッピングが失敗し、マッパーBeanが作成されませんでした(NoSuchBeanDefinitionException)。

于 2012-11-14T22:08:32.400 に答える