C#中也是可以使用Spring的。这里主要是记录下如何使用Spring来做单元测试。
首先,开发工具是vs2012 ,我们使用 nuget来获取需要的软件包,类似maven
然后,需要spring开发包 可以通过nuget来管理。如果没有就自己找找。
应该有 Spring.Aop
Spring.Core
Spring.Data
Spring.Testing.Microsoft
接下来就是 我们的测试抽象类
namespace MyApp.Core.Test { public abstract class AbstractSpringTestCase : AbstractDependencyInjectionSpringContextTests { public AbstractSpringTestCase() { // switch on field level injection PopulateProtectedVariables = true; } protected override string[] ConfigLocations { get { return new string[] { "assembly://MyApp/AppCore/AppContext.xml" ,"assembly://MyApp/AppTran/AppContext.xml" }; } } } }
这里继承了AbstractDependencyInjectionSpringContextTests 类。我们的类主要是加载配置文件。
这里就贴个配置文件上来,和java中的spring类似。
<?xml version="1.0" encoding="utf-8" ?> <objects xmlns="http://www.springframework.net" xmlns:nms="http://www.springframework.net/nms" default-lazy-init="true" > <!-- =========================================================================== --> <!-- App manager --> <!-- =========================================================================== --> <object id="appManager" type="Spring.Aop.Framework.ProxyFactoryObject"> <property name="target"> <object name="appManagerTarget" type="MyApp.Collector.DefaultAppManager, MyApp" init-method="Init" destroy-method="Cleanup"> <property name="appFactory" ref="appFactory" /> </object> </property> <property name="interceptorNames"> <list> <value>loggingAdvice</value> </list> </property> </object> <object id="appFactory" type="Spring.Aop.Framework.ProxyFactoryObject"> <property name="target"> <object name="appFactoryTarget" type="MyApp.Collector.DefaultAppFactory, MyApp" > <property name="forwarderFactory" ref="forwarderFactory" /> <property name="winAppFactory" ref="winAppFactory" /> </object> </property> <property name="interceptorNames"> <list> <value>loggingAdvice</value> </list> </property> </object> <object id="winCollectorFactory" type="Spring.Aop.Framework.ProxyFactoryObject"> <property name="target"> <object name="winAppFactoryTarget" type="MyApp.Collector.Windows.WinAppFactory, MyApp"> <property name="eventHostManager" ref="eventHostManager" /> <lookup-method name="CreateWinMockApp" object="winMockApp"/> <lookup-method name="CreateCmdApp" object="cmdApp"/> <lookup-method name="CreateGUIApp" object="GUIApp"/> </object> </property> <property name="interceptorNames"> <list> <value>loggingAdvice</value> </list> </property> </object> <object id="winEventReaderFactory" type="Spring.Aop.Framework.ProxyFactoryObject"> <property name="target"> <object name="winEventReaderFactoryTarget" type="MyApp.Collector.Windows.WinEventReaderFactory, MyApp"> <property name="eventHostManager" ref="eventHostManager" /> <lookup-method name="CreateWinMockEventReader" object="winMockEventReader"/> <lookup-method name="CreateCmdEventReader" object="cmdEventReader"/> <lookup-method name="CreateGUIEventReader" object="GUIEventReader"/> </object> </property> <property name="interceptorNames"> <list> <value>loggingAdvice</value> </list> </property> </object> <!-- =========================================================================== --> <!-- EventHost --> <!-- =========================================================================== --> <object id="eventHostFactory" type="Spring.Aop.Framework.ProxyFactoryObject"> <property name="target"> <object name="eventHostFactoryTarget" type="MyApp.Collector.Windows.Host.DefaultEventHostFactory, MyApp" > </object> </property> <property name="interceptorNames"> <list> <value>loggingAdvice</value> </list> </property> </object> <object id="eventHostManager" type="Spring.Aop.Framework.ProxyFactoryObject"> <property name="target"> <object name="eventHostManagerTarget" type="MyApp.Collector.Windows.Host.DefaultEventHostManager, MyApp" > <property name="eventHostFactory" ref="eventHostFactory" /> </object> </property> <property name="interceptorNames"> <list> <value>loggingAdvice</value> </list> </property> </object> <!-- =========================================================================== --> <!-- forwarder factory --> <!-- =========================================================================== --> <object id="forwarderFactory" type="Spring.Aop.Framework.ProxyFactoryObject"> <property name="target"> <object name="forwarderFactoryTarget" type="MyApp.Forwarder.DefaultForwarderFactory, MyApp" > <property name="connectionFactory" ref="connectionFactory" /> <property name="sendEventMeter" ref="sendEventMeter" /> </object> </property> <property name="interceptorNames"> <list> <value>loggingAdvice</value> </list> </property> </object> <!-- =========================================================================== --> <!-- Meter factory --> <!-- =========================================================================== --> <object name="receiveEventMeter" type="MyApp.Meter.DefaultEventMeter, MyApp" init-method="Init" > <property name="categoryName" value="MyAPP Receiver" /> </object> <object name="sendEventMeter" type="MyApp.Meter.DefaultEventMeter, MyApp" init-method="Init" > <property name="categoryName" value="MyAPP Sender" /> </object> <!-- =========================================================================== --> <!-- prototype aop is configure differently --> <!-- =========================================================================== --> <object type="Spring.Aop.Framework.AutoProxy.DefaultAdvisorAutoProxyCreator"> <property name="interceptorNames" value="loggingAdvicePrototype"/> </object> <object id="winMockApp" type="MyApp.Collector.Windows.Mock.WinMockApp, MyApp" singleton="false"> <property name="winEventReaderFactory" ref="winEventReaderFactory"/> <property name="eventHostManager" ref="eventHostManager"/> </object> <object id="winMockEventReader" type="MyApp.Collector.Windows.Mock.WinMockEventReader, MyApp" singleton="false"> <property name="receiveEventMeter" ref="receiveEventMeter"/> </object> <object id="GUIApp" type="MyApp.Collector.Windows.GUI.GUIApp, MyApp" singleton="false"> <property name="winEventReaderFactory" ref="winEventReaderFactory"/> <property name="eventHostManager" ref="eventHostManager"/> </object> <object id="GUIEventReader" type="MyApp.Collector.Windows.GUI.GUIEventReader, MyApp" singleton="false"> <property name="receiveEventMeter" ref="receiveEventMeter"/> <property name="remoteEventProviderResources" ref="remoteEventProviderResources"/> </object> <object id="vistaFamilyCollector" type="MyApp.Collector.Windows.Cmd.CmdApp, MyApp" singleton="false"> <property name="winEventReaderFactory" ref="winEventReaderFactory"/> <property name="eventHostManager" ref="eventHostManager"/> </object> <object id="vistaFamilyEventReader" type="MyApp.Collector.Windows.Cmdd.CmdEventReader, MyApp" singleton="false"> <property name="receiveEventMeter" ref="receiveEventMeter"/> </object> <object id="remoteEventProviderResources" type="MyApp.Collector.Windows.GUI.DefaultRemoteEventProviderResources, MyApp"> </object> <object id="impersonateUserFactory" type="MyApp.Collector.Windows.GUI.DefaultImpersonateUserFactory, MyApp"> </object> <!-- =========================================================================== --> <!-- Logging --> <!-- =========================================================================== --> <object name="loggingAdvice" type="Spring.Aspects.Logging.SimpleLoggingAdvice, Spring.Aop" > <property name="LogUniqueIdentifier" value="true"/> <property name="LogExecutionTime" value="true"/> <property name="LogMethodArguments" value="true"/> <property name="LogReturnValue" value="true"/> <property name="Separator" value=";"/> <property name="LogLevel" value="Info"/> <property name="HideProxyTypeNames" value="true"/> <property name="UseDynamicLogger" value="true"/> </object> <object name="loggingAdvicePrototype" type="Spring.Aspects.Logging.SimpleLoggingAdvice, Spring.Aop" singleton="false"> <property name="LogUniqueIdentifier" value="true"/> <property name="LogExecutionTime" value="true"/> <property name="LogMethodArguments" value="true"/> <property name="LogReturnValue" value="true"/> <property name="Separator" value=";"/> <property name="LogLevel" value="Info"/> <property name="HideProxyTypeNames" value="true"/> <property name="UseDynamicLogger" value="true"/> </object> <object type="Spring.Objects.Factory.Attributes.RequiredAttributeObjectPostProcessor, Spring.Core"/> <!-- =========================================================================== --> <!-- JMS --> <!-- =========================================================================== --> <object id="connectionFactory" type="Apache.NMS.ActiveMQ.ConnectionFactory, Apache.NMS.ActiveMQ"> <constructor-arg index="0" value="failover:(tcp://localhost:${BROKER_PORT})"/> </object> <!-- =========================================================================== --> <!-- Configuration --> <!-- =========================================================================== --> <object name="propertyPlaceHolderConfigurer" type="Spring.Objects.Factory.Config.PropertyPlaceHolderConfigurer, Spring.Core"> <property name="EnvironmentVariableMode" value="Override"/> <property name="Properties"> <name-values> <add key="BROKER_PORT" value="61616"/> </name-values> </property> </object> </objects>
这个是配置文件是实际工作中用到的,略加修改。我们看到很多,使用了Spring的AOP,虽然我很不喜欢AOP,也觉得这里用的很牵强。
接下来,就是测试类了,这里的注入,我们不许要使用注解。当然C#里的注解又是另外一个模样。
还是直接看代码
namespace MyApp.Core.Test { [TestClass] public class WinMockAppTest : AbstractSpringTestCase { protected IAppManager appManager; [TestMethod] public void testWinMockApp() { //do the test //such as Assert.IsNotNull(appManager); } } }
TestClass和TestMethod足以。