3

統合テストでモックを使用しようとしていますが、うまくいきません。Spring 3.1.1 と Mockito 1.9.0 を使用しています。状況は次のとおりです。

@Component
public class ClassToTest {

    @Resource
    private Dependency dependency;

}

@Component
public class Dependency {

    @Resource
    private NestedDependency nestedDependency;

}

さて、Spring の JavaConfig を使って ClassToTest の統合テストを行いたいと思います。これは私が試みたものであり、うまくいきません:

@Test
@ContextConfiguration
public class ClassToTestIntegrationTest {

    @Resource
    private ClassToTest classToTest;

    @Resource
    private Dependency mockDependency;

    @Test
    public void someTest() {
        verify(mockDependency).doStuff();

        // other Mockito magic...

    }


    @Configuration
    static class Config {

        @Bean
        public ClassToTest classToTest() {
            return new ClassToTest();
        }

        @Bean
        public Dependency dependency() {
            return Mockito.mock(Dependency.class);
        }

    }
}

質問を理解しやすくするために、セットアップを簡素化しました。実際には、より多くの依存関係があり、それらの一部のみをモックしたいだけです。他のものは、prod @Configuration クラスからインポートされた構成に基づいて本物です。

結局、アプリケーションコンテキストに NestedDependency タイプの Bean がないことを示す NoSuchBeanDefinitionException が発生します。私はこれを理解していません.SpringはMockitoのモック化された依存関係のインスタンスを受け取り、それを自動配線することさえしないと思いました. これが機能しないため、オブジェクト グラフ全体をモックする必要があります。これは、モックのポイントを完全に無効にします。

助けてくれてありがとう!

4

2 に答える 2

5

私は同じ問題を抱えていて、別の解決策を見つけました。Spring がすべての Bean をインスタンス化すると、それが Mockito Mock であるかどうかがチェックされます。この場合、インジェクション プロパティに対して false を返します。それを使用するには、Spring コンテキストに注入するだけです

以下のコード:

public class MockBeanFactory extends InstantiationAwareBeanPostProcessorAdapter {

    private static final MockUtil mockUtil = new MockUtil();

    public MockBeanFactory() {
        super();
    }

    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        return !mockUtil.isMock(bean);
    }

}
于 2013-02-08T10:18:49.667 に答える
2

クラスをモックするときにMockitoが行うことは、(IIRC)のような派手な名前を持つDependency$EnhancerByMockitoおそらくご存じのとおり、サブクラスは親からフィールドを継承します。

@Component
public class Dependency {

    @Resource
    private NestedDependency nestedDependency;

}


public class Dependency$EnhancerByMockito extends Dependency{
    //...
}

これは、Spring がモックで提示された場合でも基本クラスのフィールドを認識していることを意味します。できること:

  1. インターフェイスを使用します。これにより、Mockito は CGLIB 生成クラスではなく動的プロキシを使用します。

  2. モックNestedDependency- 問題をさらに 1 レベルカスケードすることはわかっています

  3. @Resourceテストの注釈スキャンを無効にする

于 2012-04-10T20:23:57.640 に答える