<?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[Mocking von Fkt. in einer Lib =&amp;gt; Linkerfehler]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Problem mit einer gemockten Funktion in einem UnitTest.</p>
<p>Da die betreffende Funktion von dem &quot;Code under Test&quot; gebraucht wird, und die Abhängigkeit zur Lib vermieden wird, wird die betreffende Funktion im UnitTest gemockt:</p>
<pre><code>extern &quot;C&quot; uint32 GetSystemTime()
{
    return 1;
}
</code></pre>
<p>Die betreffende Lib (SystemTime) muss aber im CMake-File angegeben werden, da eine andere Lib für Debugging-/Tracing-Ausgaben von dieser abhängt, es besteht also eine Abhängigkeit zwischen TraceLib und SystemTime.Lib.<br />
Das betreffende Testobjekt benutzt für Debugging-Zwecke eben TRACE_LOG()-Ausgaben, die zwingend die TraceLib benötigen.</p>
<p>Meine Frage wäre nun, wie löst man diese Abhängigkeitsprobleme auf. Nicht linken gegen die SystemTime-Lib geht nicht, wenn man die Traces behalten will?</p>
<p>Im CMakeLists File steht also</p>
<pre><code>target_link_libraries(
    Display.Test
    $(CPPUNITTEST_LIBS)
    ...
    SystemTime.lib
    ...
    Trace.Lib
    ...
)
</code></pre>
<p>Wenn beide Funktionen eingebunden werden (die gemockte und die reale Fkt.) bekomme ich &quot;already defined&quot; Linkerfehler aufgrund von mehrfach definierten Funktionen...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/320144/mocking-von-fkt-in-einer-lib-gt-linkerfehler</link><generator>RSS for Node</generator><lastBuildDate>Fri, 24 Jul 2026 08:28:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/320144.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 18 Sep 2013 09:13:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mocking von Fkt. in einer Lib =&amp;gt; Linkerfehler on Wed, 18 Sep 2013 09:15:23 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Problem mit einer gemockten Funktion in einem UnitTest.</p>
<p>Da die betreffende Funktion von dem &quot;Code under Test&quot; gebraucht wird, und die Abhängigkeit zur Lib vermieden wird, wird die betreffende Funktion im UnitTest gemockt:</p>
<pre><code>extern &quot;C&quot; uint32 GetSystemTime()
{
    return 1;
}
</code></pre>
<p>Die betreffende Lib (SystemTime) muss aber im CMake-File angegeben werden, da eine andere Lib für Debugging-/Tracing-Ausgaben von dieser abhängt, es besteht also eine Abhängigkeit zwischen TraceLib und SystemTime.Lib.<br />
Das betreffende Testobjekt benutzt für Debugging-Zwecke eben TRACE_LOG()-Ausgaben, die zwingend die TraceLib benötigen.</p>
<p>Meine Frage wäre nun, wie löst man diese Abhängigkeitsprobleme auf. Nicht linken gegen die SystemTime-Lib geht nicht, wenn man die Traces behalten will?</p>
<p>Im CMakeLists File steht also</p>
<pre><code>target_link_libraries(
    Display.Test
    $(CPPUNITTEST_LIBS)
    ...
    SystemTime.lib
    ...
    Trace.Lib
    ...
)
</code></pre>
<p>Wenn beide Funktionen eingebunden werden (die gemockte und die reale Fkt.) bekomme ich &quot;already defined&quot; Linkerfehler aufgrund von mehrfach definierten Funktionen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2353338</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2353338</guid><dc:creator><![CDATA[AlGaN]]></dc:creator><pubDate>Wed, 18 Sep 2013 09:15:23 GMT</pubDate></item><item><title><![CDATA[Reply to Mocking von Fkt. in einer Lib =&amp;gt; Linkerfehler on Wed, 18 Sep 2013 17:02:26 GMT]]></title><description><![CDATA[<p>Es gibt <s>zwei</s> folgende Möglichkeiten:<br />
- Ersetze die Funktion irgendwie mit Hilfe eines Makros. <code>#define GetSystemTime ..</code><br />
- Verwende keinen globalen Zustand wie <code>GetSystemTime</code> , wenn du keinen globalen Zustand willst. Du könntest einen eigenen Funktionszeiger an alle Stellen durchreichen, die <code>GetSystemTime</code> aufrufen. Den Zeiger kannst du in den Tests dann beliebig wählen und im Betrieb zeigt der auf das echte <code>GetSystemTime</code> .<br />
- Abwandlung vom vorherigen Vorschlag: Habe einen globalen Funktionszeiger oder Ähnliches, der je nach Bedarf geändert werden kann. Der sollte am besten nicht exakt <code>GetSystemTime</code> heißen.</p>
<p>EDIT: Für Linker-Hacks wird dich dein Nachfolger wahrscheinlich mit einer Axt durch ein Labyrinth jagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2353488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2353488</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Wed, 18 Sep 2013 17:02:26 GMT</pubDate></item><item><title><![CDATA[Reply to Mocking von Fkt. in einer Lib =&amp;gt; Linkerfehler on Thu, 19 Sep 2013 14:38:06 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>danke für Deine Antwort.</p>
<p>Sowohl der Test als auch das Object under Test liegt leider nicht in meinem Einflussbereich, da es von einem anderen Entwickler bearbeitet wird.<br />
Funktion durch ein Makro ersetzen wäre eine Möglichkeit.</p>
<p>Die Lösung mit dem Funktionszeiger habe ich nicht ganz verstanden, das würde doch bedeuten, dass ich sowohl den Produktions-Code als auch den Test-Code anfassen muss, oder? Der Production Code (das Object under Test) darf ich keinesfalls verändern, so dass diese Möglichkeit wohl ausfällt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2353758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2353758</guid><dc:creator><![CDATA[AlGaN]]></dc:creator><pubDate>Thu, 19 Sep 2013 14:38:06 GMT</pubDate></item><item><title><![CDATA[Reply to Mocking von Fkt. in einer Lib =&amp;gt; Linkerfehler on Thu, 19 Sep 2013 18:04:38 GMT]]></title><description><![CDATA[<p>Den ersten Fehler hast du schon gefunden: Fehlende Testbarkeit.<br />
Warum testest du überhaupt Code, der nicht verbessert werden soll?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2353857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2353857</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Thu, 19 Sep 2013 18:04:38 GMT</pubDate></item><item><title><![CDATA[Reply to Mocking von Fkt. in einer Lib =&amp;gt; Linkerfehler on Fri, 20 Sep 2013 06:14:01 GMT]]></title><description><![CDATA[<p>Hallo TyRoXx,</p>
<p>der Production Code liegt nicht in meinem Einflussbereich, der ursprüngliche Test auch nicht, das hat der entsprechende indische Entwickler gemacht. Ich ändere fremden Code nur als allerletztes Mittel, falls anders keine Lösung möglich ist.</p>
<p>Es gibt eben ein Abhängigkeitsproblem zwischen seinen Tests und meinem Production Code, da er das Objekt in seinem Testcode verwendet. Habe jetzt als Workaround meine Trace-Ausgaben entfernt, da sie sowieso nur im Debug-Build gebraucht werden.</p>
<p>Generell interessiert mich aber bei UnitTests, wie mit solchen Abhängigkeiten umgegangen wird.<br />
Also gemockte Funktion von LibA in UnitTest für Objekt B, Objekt B braucht LibC, die wiederum LibA bedingt, irgendwie bekomme ich da einen Zirkelschluss <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2353929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2353929</guid><dc:creator><![CDATA[AlGaN]]></dc:creator><pubDate>Fri, 20 Sep 2013 06:14:01 GMT</pubDate></item></channel></rss>