<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[UnitTests und C++]]></title><description><![CDATA[<p>Hallo,</p>
<p>Da ich gerade eine Reihe UnitTests (mit CPPUNIT) zu einer bereits bestehenden Applikation schreiben darf, stehe ich immer wieder vor einem Problem:</p>
<p>Eine Klasse benützt eine andere Klasse dessen Verhalten ich entweder nicht testen will oder die in meiner Testumgebung gar nicht richtig funktioneren kann. Nun wäre es meist kein Problem eine Mock-Klasse dafür zu schreiben, nur, wie ersetzte ich das Objekt mit dem Mock? Mittels einer Factory die Interfaces ausspuckt? Diese Lösung finde ich allerdings schlecht, sie ist mit sehr viel Aufwand verbunden, generiert unnötig neuen Code und ich erhalte einen Runtime-Polymorphismus den ich gar nie brauche und auch nie will. Gut, die Factory könnte ich mir sparen und meine Testklasse als friend deklarieren, um die Interfaces komme ich aber nicht rum.</p>
<p>Das Problem muss doch immer wieder auftauchen, was gibt es sonst noch für Lösungen?</p>
<p>Ich bin für jede Antwort dankbar!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/227656/unittests-und-c</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 19:25:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/227656.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 18 Nov 2008 12:19:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to UnitTests und C++ on Tue, 18 Nov 2008 12:19:13 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Da ich gerade eine Reihe UnitTests (mit CPPUNIT) zu einer bereits bestehenden Applikation schreiben darf, stehe ich immer wieder vor einem Problem:</p>
<p>Eine Klasse benützt eine andere Klasse dessen Verhalten ich entweder nicht testen will oder die in meiner Testumgebung gar nicht richtig funktioneren kann. Nun wäre es meist kein Problem eine Mock-Klasse dafür zu schreiben, nur, wie ersetzte ich das Objekt mit dem Mock? Mittels einer Factory die Interfaces ausspuckt? Diese Lösung finde ich allerdings schlecht, sie ist mit sehr viel Aufwand verbunden, generiert unnötig neuen Code und ich erhalte einen Runtime-Polymorphismus den ich gar nie brauche und auch nie will. Gut, die Factory könnte ich mir sparen und meine Testklasse als friend deklarieren, um die Interfaces komme ich aber nicht rum.</p>
<p>Das Problem muss doch immer wieder auftauchen, was gibt es sonst noch für Lösungen?</p>
<p>Ich bin für jede Antwort dankbar!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1616439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1616439</guid><dc:creator><![CDATA[osiris81]]></dc:creator><pubDate>Tue, 18 Nov 2008 12:19:13 GMT</pubDate></item><item><title><![CDATA[Reply to UnitTests und C++ on Tue, 18 Nov 2008 20:46:42 GMT]]></title><description><![CDATA[<p>keiner eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1616807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1616807</guid><dc:creator><![CDATA[osiris81]]></dc:creator><pubDate>Tue, 18 Nov 2008 20:46:42 GMT</pubDate></item><item><title><![CDATA[Reply to UnitTests und C++ on Wed, 19 Nov 2008 11:42:19 GMT]]></title><description><![CDATA[<p>hast du beispielcode?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1617013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1617013</guid><dc:creator><![CDATA[testerer]]></dc:creator><pubDate>Wed, 19 Nov 2008 11:42:19 GMT</pubDate></item><item><title><![CDATA[Reply to UnitTests und C++ on Wed, 19 Nov 2008 13:19:05 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>PseudoCode:</p>
<pre><code class="language-cpp">class Manager
{
friend class ManagerTest;
public:
Manager() : m_worker( new Worker() )
{
}

void doSomething()
{
  m_worker-&gt;doSomething();
}

private:
Worker* m_worker;
};

class Worker;
class WorkerMock;

class ManagerTest
{
....
void testManager()
{
  Manager* manager = new Manager(); 
  manager-&gt;m_worker = new WorkerMock() // geht so natürlich eben nicht
  manager-&gt;doSomething();
  CPPUNIT_ASSERT( manager-&gt;m_worker-&gt;didSomething() );
} 
...
};
</code></pre>
<p>Ich hoffe das Beispiel ist verständlich...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1617087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1617087</guid><dc:creator><![CDATA[osiris81]]></dc:creator><pubDate>Wed, 19 Nov 2008 13:19:05 GMT</pubDate></item><item><title><![CDATA[Reply to UnitTests und C++ on Thu, 20 Nov 2008 08:18:32 GMT]]></title><description><![CDATA[<p>ok, letzter push...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1617498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1617498</guid><dc:creator><![CDATA[osiris81]]></dc:creator><pubDate>Thu, 20 Nov 2008 08:18:32 GMT</pubDate></item><item><title><![CDATA[Reply to UnitTests und C++ on Thu, 20 Nov 2008 08:54:34 GMT]]></title><description><![CDATA[<p>Naja. Ohne Laufzeitpolymorphismus wird das wohl lediglich durch Kompilierzeitpolymorphismus gehen, oder sogar noch früher. Ich nenn das mal Präprozessorpolymorphismus.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Sowas ähnliches wirst du wahrscheinlich auf jeden Fall brauchen.</p>
<pre><code class="language-cpp">#ifdef TEST
#define WorkerType WorkerMock
#elif
#define WorkerType Worker
#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1617530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1617530</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 20 Nov 2008 08:54:34 GMT</pubDate></item><item><title><![CDATA[Reply to UnitTests und C++ on Thu, 20 Nov 2008 13:01:16 GMT]]></title><description><![CDATA[<p>oder &quot;Linktime-Polymorphismus&quot;: Da der Mock und der Original Worker das gleiche öffentliche Interface anbieten sollten, reicht es wenn die .cpp andere Implementationen für die Methoden schreibt:</p>
<pre><code class="language-cpp">//worker.hpp 
class Worker 
{
public:
  void foo();  
};

//worker.cpp
#include worker.hpp
void Worker::foo()
{
  //mach ernst
}

//Mock_worker.cpp
#include worker.hpp
void Worker::foo()
{
  std::cout &lt;&lt; &quot;call of Worker::foo()&quot; &lt;&lt; std::endl;  
}
</code></pre>
<p>beim Linken dann je nach Bedarf die Mock_worker.o oder die worker.o mit den anderen Objektdateien zusammenlinken - fertig...<br />
So gibts keine unnötigen Workarounds im Quelltext für den Einbau der Testklassen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1617699</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1617699</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 20 Nov 2008 13:01:16 GMT</pubDate></item></channel></rss>