補åã®ã¢ãŒããã¯ãã£ã調ã¹ãŠããããã©ã®ããã«æ©èœããããèŠãããšãé¢çœãå ŽåããããŸãã æèšãå解ããããšã¯ã§ããŸããããå ã«æ»ãããšã¯ã§ããŸãã...ããããæèšãšã¯ç°ãªãããœãŒã¹ã«ã¢ã¯ã»ã¹ãããšãã«ãœãããŠã§ã¢è£œåãå解ããŠçµã¿ç«ãŠãããšãã§ããŸãã ãããŠã解決çã¯ãã§ã«å®è·µã«é©çšãããŠããããšãããããŸããã
CxxMock-C ++ã§ã®ã¢ãã¯ãªããžã§ã¯ãã®èšäºã§æžããCxxMockãäœæããå¿ èŠããããšããåæ§ã®GoogleMockã®åäœåçã調ã¹ãŸããã ãŸãã¯ãã以åã«ãc10kãµãŒããŒmathopdã®åºæ¬çãªã¢ã€ãã¢ãèŠã€ããŸãã ãããã«ãã ããã®åŸã®ãããžã§ã¯ãã§ãã¢ãŒããã¯ãã£ã®èšèšãæ¹åããããšãã§ããŸããã
ãããã£ãŠãåºæ¬çãªæŠå¿µãšãCxxMockãæ©èœããåå ã«ã€ããŠèª¬æããŸãã ãããŠãããã¯æãä»ãã®ãé¢çœãã£ãã§ãã ä»ã®äººãããªãã®ç·Žç¿ã§ããªããå©ããéãããã€ãã®ããªãã¯ã¯ç°¡åã§ãããšæããããããŸããã
CxxMockã€ã³ãµã€ãã«ãã¯
ã¹ããŒããè¡ãããèå³æ·±ã決å®ïŒ
- åå°ããããã®ããã«æ¯ãèãæš¡å£
- ãªãŒããŒãããã®ãªãæœèšã®å·¥å Žã®ç»é²ã
- ã€ã³ã¿ãŒãã§ã€ã¹ã®ç®çã®å®è£ ãäœæããŸãã
- ããã°ã©ãã³ã°ã¡ãœããã®åäœã
- ã¡ãœããå®è¡å¶åŸ¡
- åŒæ°ã®æ¯èŒã
- ã«ã¹ã¿ã ã¡ãœããã®å®è¡ã
åå°ããããã®ããã«æ¯ãèãæš¡å£
CïŒã«ã¯ãªãã¬ã¯ã·ã§ã³ããããC ++ã«ã¯ãªãã¬ã¯ã·ã§ã³ããããŸããããã¿ã€ãã®èå¥ã«åœ¹ç«ã€RTTIããããŸãããããã°ã©ã ã®å®è¡äžã«ã¡ãœãããåŒã³åºããããã¯ã©ã¹ãåçã«æ§ç¯ããããšã¯ã§ããŸããã ã€ãŸããäœããäœæããã«ã¯ãã³ã³ãã€ã«æã«ãã§ã«ååšããŠããå¿ èŠããããCxxMockã«ãŒãã«ã¯äœæããå¿ èŠããããã®ãšãã®äœææ¹æ³ãç¥ã£ãŠããå¿ èŠããããŸãã ãããå®çŸããã«ã¯ãCxxTestããã¹ãçšã®ç®æ¬¡ãäœæããQtããã¹ãŠã®ä¿¡å·ãšã¹ããããžã®ãªã³ã¯ãå«ãQMetaOBjectãäœæããã®ãšåãæ¹æ³ã§ã³ãŒãããŒãµãŒã䜿çšã§ããŸãã CxxMockã®å ŽåãCxxTestã®æŠå¿µã«æºæ ããããããçš®é¡ã®æãããæ£èŠè¡šçŸãšããã®ãããªå Žåãèæ ®ããŠæ¬åŒ§ã解æããã¢ã«ãŽãªãºã ã䜿çšããŠãPythonã§ãžã§ãã¬ãŒã¿ãŒãäœæããå¿ èŠããããŸããã
namespace NS4 { namespace NS5 { class Interface { public: virtual void method(int a)=0; virtual Type* method2(const Type& a)=0; virtual ~Interface(){}; }; }}
åºåã§ããžã§ãã¬ãŒã¿ãŒã¯ãã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããã¯ã©ã¹ïŒã¯ã©ã¹ïŒã§ããããŒãã¡ã€ã«ãäœæããŸã
namespace NS4 { namespace NS5 { class CXXMOCK_DECL( Interface ) { public: virtual int method(int a) { CXXMOCK( int, a ) } virtual Type* method2(const Type& a){ return CXXMOCK( Type*, a ) } virtual ~Interface(){}; }; CXXMOCK_IMPL( Interface ) }}
ã€ãŸããæåã§èšè¿°ã§ããIDEã®ã»ãŒãã¹ãŠã®æ§æããŒãµãŒã§è§£æã§ããéåžžã«èªã¿ãããã³ãŒãã§ãã æåã®ããŒãžã§ã³ã¯ããã®ãããªã¯ã©ã¹ãæåã§äœæããããšã«ããè¡ãããŸããã
ãªãŒããŒãããã®ãªãå·¥å Žã®ç»é²
é¡ã«è¿ã¥ããšãsetUpïŒïŒã®ããæç¹ã§ã¯ã©ã¹ããšã«ã€ã³ã¿ãŒãã§ã€ã¹ã®ç¹å¥ãªå®è£ ãæã€ããããã«æ¬¡ã®ãããªã³ãŒããèšè¿°ããŸãã
cxxmock::Repository::instance().registerFactory<Interface>( new MockFactory<Interface, InterfaceImpl>() ); cxxmock::Repository::instance().registerFactory<Interface2>( new MockFactory<Interface2, Interface2Impl>() ); ...
åæããå¿ èŠããããŸããã€ã³ã¿ãŒãã§ã€ã¹ã®ååã10åç¹°ãè¿ãã®ã¯ããŸã䟿å©ã§ã¯ãããŸããã ãã®ã³ãŒããèªåçã«äœæãããå Žåã§ããã©ãã«æ¿å ¥ããå¿ èŠããããŸããïŒ
å¶éããããŸãïŒ
- ã»ãšãã©ã®å ŽåãCxxTestã䜿çšããå ŽåãmainïŒïŒé¢æ°ãæåã§æžãæããå¿ èŠã¯ãããŸããã ã€ãŸããã³ãŒããæ¿å ¥ã§ããŸããã
- ãã ããåãã¹ãã»ããã®åsetUpïŒïŒã¡ãœããã«ç»é²ããããšããïŒincludeãã£ã¬ã¯ãã£ããä»ããŠç®æ¬¡ãæ¥ç¶ããããšã䟿å©ã§ã¯ãããŸããã
- ãããŠãã¯ã©ã¹ã宣èšãããŠããã®ãšåãå Žæã§ã³ãŒããå®è¡ããããšã¯ãäžèŠäžå¯èœã§ã
ããããã§ããªãããæ¬åœã«ããããšãã¯ãã§ããŸãã ãã®ç®çã®ããã«ãã¯ãåŒã³åºãã䜿çšãããŸãã
CXXMOCK_IMPL( Interface )
ãã®ãã¯ãã¯ãéçå€æ°ïŒã€ã³ã¿ãŒãã§ã€ã¹ã§å ¥åãããã³ã³ãããšäœæãããã¯ã©ã¹ïŒã®äœæãæ åœããŸãã
#define CXXMOCK_IMPL( interface ) CxxMock::Container<interface, cxxmocks_impl_##interface> cxxmocks_instance_##interface;
C ++ã§ã¯ãANSI Cãšåæ§ã«ãã©ã€ãã©ãªãã¡ã¢ãªã«ããŒããããšãã«ãmainïŒïŒããã³_initïŒïŒãéå§ããåã§ãããã¹ãŠã®éçå€æ°ãšã°ããŒãã«å€æ°ãæåã«åæåãããŸãã CXXMOCK_IMPLã§å®£èšãããå€æ°ã¯ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã§ãããããç¹å®ã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ãããªããžã§ã¯ããäœæã§ããã³ã³ãããããããšãã¬ãžã¹ããªã«äŒããããšãã§ããã³ã³ã¹ãã©ã¯ã¿ãåŒã³åºãããŸãã
template<class Interface, class Impl> Container<Interface, Impl>::Container() { Repository::instance().registerFactory( this ); }
ã³ã³ããã®äž»ãªç®çã¯ãã€ã³ã¿ãŒãã§ã€ã¹ãšãã®ã¯ã©ã¹ã¹ã¿ãã®å¯Ÿå¿ã«é¢ããæ å ±ãæ ŒçŽããããšã§ãããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããããã®ãã¡ã¯ããªã¡ãœãããããããã¡ã¯ããªããç¶æ¿ãããŸãã
template<class Interface, class Impl> Interface* Container<Interface, Impl>::create(){ return new Impl(); }
ãããã£ãŠãããã«ãã¡ã¯ããªãšåŒã°ããŸãã
ãã¡ãããã°ããŒãã«å€æ°ã®åæåã®é åºã¯å®çŸ©ãããŠããŸããããã³ã³ãããªããžããªïŒãã¡ã¯ããªïŒã®é 延åæåã䜿çšããŠãããããã°ããŒãã«å€æ°ãäœæããé åºã¯éèŠã§ã¯ãããŸããã ãããã£ãŠãäžé£ã®åäœãã¹ãã®å®è¡ãéå§ããããšãCxxMockã¯åäœãã¹ãã«å¿ èŠãªã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ãããã¹ãŠã®ã¯ã©ã¹ãèªèããŸãã
é©åãªå®è£ ã®äœæ
äœããäœæããã«ã¯ãäœãäœæããããç¥ã£ãŠãå¿ èŠãªãã®ãäœæããæ¹æ³ãç¥ã£ãŠãã人ãèŠã€ããå¿ èŠããããŸãã
.NETã§ã¯ã次ã®ããã«ç°¡åã«èšè¿°ã§ããŸãã
_registry[ typeof( factory ) ] = factory;
C ++ã®å ŽåãRTTIã§ããžãã¯ãé©çšããå¿ èŠããããŸãã
template<class T> void Repository::registerFactory(Factory<T>* factory) { string tname = typeid( typename Factory<T>::TargetType ).name(); _registry[ tname ] = factory; }
_registryã¯éåžžã®std :: map <stringãHandle *>ã§ãããHandleïŒãã¡ã¯ããªãŒã®åºæ¬ã¯ã©ã¹ïŒãžã®ãã€ã³ã¿ãŒã䜿çšããŠdynamic_castãæ©èœããããã«ããŸãã
ãã¡ã¯ããªãã¬ãžã¹ããªã«ç»é²ããããããªããžããªã«ã€ã³ã¿ãŒãã§ã€ã¹ã®ã¹ã¿ããªããžã§ã¯ãã®å®è£ ãäœæããããã«äŸé Œã§ããŸãã
template<class T> T* Repository::create() { RepositoryTypeMap::iterator it = _registry.find( typeid(T).name() ); ... return dynamic_cast< Factory<T>* >(&(*it->second))->create(); }
ããã§ã¯ãHandleããFactory *ã«åããã£ã¹ãããããªãã¯ãé©çšããŸããã³ã¬ã¯ã·ã§ã³ã«ããã®ã¯ãHandleã¯ã©ã¹ã®ã¿ãå ±æããå®å šã«ç°ãªãåã®ãã¡ã¯ããªã§ãã
ããã°ã©ãã³ã°æ¹æ³ã®åäœ
ã¡ãœããã®åäœã®ããã°ã©ãã³ã°ã¯CxxMockã®æãéèŠãªéšåã§ããIDEãå¿ èŠãªãã¹ãŠã®åŒæ°ã匷調衚瀺ããããã«ã€ã³ã¿ãŒãã§ã€ã¹ã¡ãœãããæ瀺çã«åŒã³åºãå¿ èŠããããŸããããã®ç¹å®ã®åŒã³åºãã«é¢ãããã©ã¡ãŒã¿ãŒãCxxMockã«äŒããå¿ èŠãããããã§ãã
çæ³çã«ã¯æ¬¡ã®ããã«ãªããŸãïŒRhino.MocksãCïŒïŒïŒ
Expect.Call( mock->method( 5 ) ).returns( 10 ); Expect.Call( ()=> { mock->voidMethod( 5 ); } ).repeat.any;
å®éãããã§ã¯2ã€ã®åŒã³åºããçºçããŸãã
- ãŸããã€ã³ã¿ãŒãã§ã€ã¹ã¡ãœããmock-> methodïŒïŒãæ£çŽã«åŒã³åºããã次ã«
- çµæã¯ãäœã§ããExpect.CallïŒïŒåŒã³åºãã«æž¡ãããåŒã³åºãæ å ±ãå«ãCalllInfoæ§é äœãè¿ãããŸãã
Rhino.Mocksã¯ãçŸåšã®ã³ã³ããã¹ããšã¢ã¯ãã£ããªMockRepositoryã«ã€ããŠãããç¥ã£ãŠããExpectã¯ã©ã¹ã䜿çšããŸãã
C ++ããŒãžã§ã³ã®å Žåãåæ§ã®ããªãã¯ãé©çšããŸããã
TS_EXPECT_CALL( mock->method(10) ).returns(5);
ãã ããåŒã³åºããé衚瀺ã«ãªã£ãäºææ§ã®ããCxxTest眲åã§ãã¯ãTS_EXPECT_CALLã䜿çšããŸãã
CxxMock::Repository::instance().expectCall( mock->method(10) )
ããã§ã®Rhino.Mocksãšã®éãã¯ãæåã®ã±ãŒã¹ã§ã¯ãªããžããªã€ã³ã¹ã¿ã³ã¹ïŒMocksRepositoryïŒãžã®ã¢ã¯ã»ã¹ãé ãããã«è¿œå ã®ã¯ã©ã¹ã䜿çšãããã2çªç®ã§ã¯methodïŒïŒã¡ãœãããåŒã³åºãããæ¹æ³ããã¹ã¯ããæ©äŒãããããšã§ãã
callInfoæ§é äœãexpectCallïŒïŒããã®åç §ã«ãã£ãŠè¿ãããåŸããªããžã§ã¯ããèšå®ããéåžžã®äœæ¥ãçºçããŸãã
åŒæ°ãæž¡ã
ã¡ãœãããåŒã³åºãããåŒæ°ãæžãçããæ»ãå€ãä¿åãããŠè¿ãããããã«ããããšã«é¢ããèå³æ·±ã質åã åŒæ°ãä¿åããããããšæ¯èŒããå¿ èŠããããŸãã
CxxMockã«ã¯æ··åãœãªã¥ãŒã·ã§ã³ããããŸãã
1.èªåçæããã°ã©ã ã¯ãCXXMOCKãã¯ãã䜿çšããŠã¯ã©ã¹ãäœæããŸããããã«ãããæåã¢ãŒãã§ã®äœ¿çšãç°¡åã«ãªããŸãã
int method(int a) { return CXXMOCK(int, a); }
2. CXXMOCKãã¯ãã¯ããªãŒããŒããŒããããã¡ãœããcxxmock_object.mockïŒMOCK_FUNCIDãargsïŒãåŒã³åºããŸãã CïŒã®Action <>ïŒæ倧10åã®åŒæ°ïŒã«äŒŒãä»»æã®ã¿ã€ãã³ã°ããããCxxMockã«ãŒãã«ã«ã¡ãœããåã®æååè¡šçŸãäŒããŸãã åŒã³åºãããã¡ãœãããšãã®ã·ã°ããã£ãæ£ç¢ºã«ç¥ãããšãéèŠã§ãããC ++ãçŽç²ãªçŽç²ã¡ãœããããªãŒããŒããŒãã§ããããã__ PRETTY_FUNCTION__ãŸãã¯__FUNCDNAME__ãå®è£ ããMOCK_FUNCIDãã¯ãã䜿çšããŠãå®å šãªã¡ãœããã·ã°ããã£ãåŒã³åºãããšã«ããç»é²ã䜿çšãããŸãã³ã³ãã€ã©ã«ã€ããŠã
template <typename R, typename A1, typename A2> R MockObject::mock( const std::string& funcname, A1 a1, A2 a2) { // processCall() : . return this->processCall<R>( method(funcname).arg( a1 ).arg( a2 ) ); } CallInfo& MockObject::method( std::string funcname ) { CallInfoPtr ptr = new CallInfo(funcname); Repository::instance().setLastCall( ptr ); return *ptr; }
ãªãŒããŒããŒããããã¡ãœããå ã§ããã¹ãŠã®åŒæ°ãå®éã«ç»é²ãããCallInfoæ§é ãããã«æ§æããããã«åœ¢æãããŸã
googlemockãœãªã¥ãŒã·ã§ã³ãšã¯ç°ãªããããã§ã¯ãååŒã³åºãã®MockObject :: mockïŒïŒã¡ãœããã¯ãåŒã³åºãã«é¢ãããã¹ãŠã®æ å ±ãæžã蟌ãŸããåãCallInfoæ§é ã圢æããŸãã ã¡ãœããã®åŒæ°ã¯ãã¯ã©ã¹ãã¡ã¯ããªã®å Žåãšåãæ¹æ³ã§ä¿åãããŸãã
template<typename A> CallInfo& CallInfo::arg(const A value ) { inValues[ inValues.size() ] = new Argument<A>(value); return *this; }
ãã®åŸãåçã¢ãŒãã§ã¯ããã¹ãŠã®Argumentå®è£ ã«å¯ŸããŠçµ±äžãããIArgumentã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠãåŒæ°ã®ã³ã¬ã¯ã·ã§ã³ã®åçŽãªæ¯èŒãå®è¡ãããŸãã
åŒæ°ã®æ¯èŒ
åŒæ°ã®æ¯èŒã¯éåžžã«ç°¡åã§ãã ãããè¡ãã«ã¯ãäºæ³ãããå€ãååŸãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹åŒã³åºãã«æ¥ãå€ãšæ¯èŒããŸãã ãŸããå€ãã®æ¯èŒãªãã·ã§ã³ããããããããã§ã¯ãã¹ãŠã®ã¿ã€ããæ¯èŒããããã«CxxTestæ©èœã䜿çšããŸãã 圌ã«ã¯ãã®æ©äŒããããŸãã
template<typename T> bool Argument<T>::compare( const IArgument& other ) const { const Argument<T> *arg = dynamic_cast< const Argument<T>* >( &other ); return CxxTest::equals( Value, arg->Value); }
ããæ·±å»ãªåé¡ã¯ã次ã®ãããªé©åãªãšã©ãŒã¡ãã»ãŒãžã圢æããããã«ãå€ã®æååè¡šçŸãååŸããããšã§ããã
åŒã³åºãäºå®ïŒã€ã³ã¿ãŒãã§ã€ã¹::ã¡ãœããïŒ5ïŒ
å®éã®åŒã³åºãïŒInterace :: method2ïŒ6ïŒ
éçºè ã¯èªåã®ããŒã¿åãé©çšã§ãããã¹ãã«äœããã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšããå Žåã¯ãäœåãªãã®ãèšè¿°ããªãã§ãã ããã ãããã£ãŠãCxxTestãããã«é©çšãããŸãã
template<typename TVal> std::string convertToString(TVal arg ) const { return CxxTest::ValueTraits<T>( Value ).asString(); } const std::string toString() const { return convertToString( Value ); }
ããã2ã€ã®ããšãè¡ãããšããCxxTestãšã®çµ±åãå®éã«äœ¿çšãããå¯äžã®å Žæã§ãã
ã«ã¹ã¿ã ã¡ãœããã®å®è¡
ã«ã¹ã¿ã ã¡ãœãããå®è¡ããã«ã¯ãããã€ãã®æ¡ä»¶ãå¿ èŠã§ãã
- ã¡ãœãããæ£ããåŒã³åºãããã«ã¯ãåŒã³åºãå¿ èŠãããã¡ãœãããšãã®ã¿ã€ãã«é¢ããæ å ±ãä¿åããå¿ èŠããããŸãã
- åŒæ°ã®æ°ã«é¢ä¿ãªãããŠãŒã¶ãŒã¡ãœããåŒã³åºããçããåŒã³åºãå¿ èŠããããŸãã
- å³å¯ãªåæå®ãèãããšãå¯å€æ°ã®åŒæ°ããããã®ããã«ã¡ãœããåŒã³åºããäœæããå¿ èŠããããŸãã
ã¡ãœããã«é¢ããæ å ±ãä¿åããã«ã¯ãå ¥åã§åãåã£ãé¢æ°ãžã®ãã€ã³ã¿ãŒãæ ŒçŽãããã³ãã¬ãŒãã¯ã©ã¹ãäœæããŸãã
template< typename Sender, typename T> CallInfo& action( Sender* sender, T method ) { _action = new Action<Sender, T>(sender, method ); return *this; }
ãäœãããããªãããåŒã³åºãããã«ãã€ã³ã¿ãŒãã§ã€ã¹ïŒIActionïŒãå®è£ ãããããã·ã¡ãœãããé©çšããŸããããã®å éšã§ãŠãŒã¶ãŒã¡ãœãããåŒã³åºãããã®ç¹å®ã®æŠç¥ãå®è£ ãããã³ãã¬ãŒãã¡ãœãããåŒã³åºããŸãã
template< typename Sender, typename T> class Action : public IAction { Sender* _sender; T _method; ... // template<typename R, typename A> void callMethod(IArgumentPtr result, const ArgList& args, R (Sender::*method)(A)){ result->setValue(Argument<R>((_sender->*_method)( args.val<A>(0) )) ); } ... void call(IArgumentPtr result, const ArgList& args) { callMethod(result, args, _method ); } }
åãã³ãã¬ãŒãå®è£ ã§ã¯ããŠãŒã¶ãŒã¡ãœããã®çœ²åãæ瀺çã«ç€ºããŠãããããcallMethodïŒïŒã®æç¹ã§ãã¿ã€ãTã¯ã¿ã€ãRïŒSender :: * methodïŒïŒAïŒã«å解ãããŸãã ããã«ãããã³ãŒã«ã®ç¹å®ã®ããŒãžã§ã³ãåå¥ã«åŠçã§ããŸãã ãŸããã¡ãœããåŒã³åºããç»é²ããã®ãšåãæ¹æ³ã§ãŠãŒã¶ãŒã¡ãœãããžã®åŒã³åºããäœæããŸãã
ãã€ã³ã¿ãŒãã§ã€ã¹ããç¶æ¿ããããã³ãã¬ãŒãããœãªã¥ãŒã·ã§ã³ã䜿çšãããããå€ãã®ãµãŒãã¹ã¯ã©ã¹ãäœæããå¿ èŠã¯ãããŸãããåŒã³åºãæŠç¥ã®å®è£ ã§ã¡ãœããã®å€ãã®ããŒãžã§ã³ãäœæããã ãã§ååã§ãã ããã¯ãå¯å€æ°ã®åŒæ°ãæã€ã¡ãœããåŒã³åºããã·ãã¥ã¬ãŒãããŸãã
ãããã«
é©çšãããããªãã¯ã®äž»ãªãã€ã³ãïŒ
- åçŽãªããã¹ãã§ããæ¬åœã«ããããšãã«ããªãã¬ã¯ã·ã§ã³ããæš¡å£ããããšãã§ããŸã
- ãªããžã§ã¯ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŠãå¶åŸ¡ãmainïŒïŒã«æž¡ãåã«ä»»æã®ã³ãŒããå®è¡ã§ããŸãã
- ãã³ãã¬ãŒãã¯ã©ã¹ãå ±éã®ãã€ã³ãã«ãã€ã³ãããã«ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ãç¶æ¿ããå¿ èŠããããŸããdynamic_castã¯ãå¿ èŠã«å¿ããŠæ®ããå®è¡ããŸãã
- ã°ããŒãã«ã³ã³ããã¹ãïŒExpect.CallïŒ...ïŒïŒãæé»çã«äœ¿çšããŠãã·ãŒã±ã³ã¹ãã§ãŒã³ãæ§ç¯ã§ããŸãã
- å€æ°ã®ãªãŒããŒããŒããããã¡ãœãããšåŒæ°ã³ã³ãããŒã®ã³ã¬ã¯ã·ã§ã³ã«ãããç¬èªã®ããŒãžã§ã³ã®RPCãŸãã¯åŒæ°ãªã¹ãã®æ¯èŒã¿ã¹ã¯ãç°¡åã«äœæã§ããŸãã
- èªåã§ãã¹ãŠãè¡ãå¿ èŠã¯ãããŸããããã©ãããã©ãŒã ããã®æ©äŒããã§ã«æäŸããŠããå ŽåããããŸã
- ãã³ãã¬ãŒãå ã®è€ååã¯ãããåçŽãªåã«å解ã§ããŸããããã«ãããå®è£ æ¹æ³ãããæ£ç¢ºã«éžæã§ããŸã
ããã¯ããããããã®åçŽãªCxxMockã©ã€ãã©ãªã§äœ¿çšããããã¹ãŠã®äž»ãªããªãã¯ã§ããã¡ã€ã³ã³ãŒãã¯ããã15kbã§ãããéçºè ãšIDEã®ç掻ãå€§å¹ ã«ç°¡çŽ åã§ããŸãã
ãã¹ãŠãSourceForgeãšGitHubã«ãããŸã ã
ãæž èŽããããšãããããŸããã
åç §è³æ
äœãèªã
DAOããã°ã©ãã³ã°ãç解ããããã«ã以äžããå§ãããŸãã
- ãã€ã€ãŒãºã»ã¹ã³ããã C ++ã®å¹æçãªäœ¿çšã 55ããã°ã©ã ã®æ§é ãšã³ãŒããæ¹åãã確ããªæ¹æ³
- ãžã§ã³ã»ãã³ãã¬ãŒ ããã°ã©ãã³ã°ã®çç