1

XML Spring 構成のこれら 2 つの部分が 2 つの別個のファイルにあるとします。

//daoContext.xml
<bean id="myDao" class="com.MyDao"/>

//logicContext.xml
<bean id="myLogic" class="com.MyLogic">
    <constructor-arg ref="myDao"/><!--or other type of injection--?
</bean>

そして、テストクラスがあります:

@ContextConfiguration("logicContext.xml")
public class BaseLogicTest extends AbstractTestNGSpringContextTests {
    @Autowired
    private MyLogic myLogic;

    @Test
    public void testMyTestable() {
        //...
    }
}

今、私が欲しいのは、MyDaoクラスをモックして、どういうわけか注入することができるようにすることです。これにより、モックMyLogicされた. これはSpring/Spring Testを使用して可能ですか?BaseLogicTestMyLogicMyDao

4

2 に答える 2

2

最も簡単な解決策は、すべての xml をロードすることです。テストケースの依存関係を手動で置き換えます。

@ContextConfiguration("logicContext.xml")
public class BaseLogicTest extends AbstractTestNGSpringContextTests {
    @Autowired
    private MyLogic myLogic;

    @Before
    public void injectTestDoubles() {
        myLogic.setMyDao(...);
    }

    @DirtiesContext
    @Test ...//test methods
}

ただし、これによりアプリケーション コンテキストが破損するため、同じアプリケーション コンテキストを共有する他のテスト ケースで「実際の」myDao が必要な場合は @DirtiesContext が必要です。

最も一般的な解決策 (私の個人的な意見:P) は、mockito とテスト固有の xml を使用することです。

//daoContext.xml
<bean id="myDao" class="com.MyDao"/>

//logicContext.xml
<bean id="myLogic" class="com.MyLogic">
    <constructor-arg ref="myDao"/><!--or other type of injection--?
</bean>

//test-logicContext.xml
<bean id="myDao" class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="com.MyDao" />
</bean>

@ContextConfiguration({"logicContext.xml", "test-logicContext.xml"})
public class BaseLogicTest extends AbstractTestNGSpringContextTests {
    @Autowired
    private MyLogic myLogic;

    @Autowired
    private MyDao myDao;//retrieve mock so you could define expectations

    @Test //test methods

    @After public void clearMocks() {
        Mockito.reset(myDao);//this is important if you have several test methods
    }
}

そして、このソリューションは、easyMock のような他のモック フレームワークでも機能します。

于 2013-09-11T01:36:11.890 に答える