<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>$&gt; blog detassigny.net</title><description>Notes on backend engineering, testing and clean code</description><link>https://blog.detassigny.net/</link><atom:link href="https://blog.detassigny.net/feed_rss_created.xml" rel="self" type="application/rss+xml" /><managingEditor>Gabriel de Tassigny</managingEditor><language>en</language><pubDate>Tue, 13 Oct 2026 13:02:06 +0000</pubDate><lastBuildDate>Tue, 13 Oct 2026 13:02:06 +0000</lastBuildDate><ttl>1440</ttl><generator>Zensical RSS</generator><item><title>Zensical Migration</title><author>Gabriel de Tassigny</author><description>&lt;h1 id=&quot;zensical-migration&quot;&gt;Zensical Migration&lt;/h1&gt;
&lt;p&gt;This blog was migrated to Zensical... and boy did Claude made this easy!&lt;/p&gt;
&lt;!-- more --&gt;

&lt;h2 id=&quot;previous-stack&quot;&gt;Previous Stack&lt;/h2&gt;
&lt;p&gt;This blog was built years ago, using a basic custom CMS I built called &lt;a href=&quot;https://github.com/gabriel-detassigny/simple-blog&quot;&gt;simple-blog&lt;/a&gt;. Both the blog and the CMS were never intended to be more than some fun side projects, and they never went beyond that.&lt;/p&gt;
&lt;p&gt;That custom CMS was built in pure PHP, with a few composer packages cherry-picked here and there. &lt;/p&gt;
&lt;p&gt;It provided a basic admin UI, and required some maintenance which I admittedly didn&apos;t do much as the blog quickly died down ...also having kids broke all motivation to write blog posts or do side projects for a while!&lt;/p&gt;
&lt;h2 id=&quot;the-dilemma&quot;&gt;The dilemma&lt;/h2&gt;
&lt;p&gt;For a while, I was wondering what to do with this blog... no one cares about this blog except me. No one is really reading this except me, years later.&lt;/p&gt;
&lt;p&gt;The problem is maintaining an old custom stack with an admin access was a security risk. And yet I liked having this around, for me to revisit my thoughts years prior.&lt;/p&gt;
&lt;p&gt;So what should I do? Delete the blog completely? Leave it as is?&lt;/p&gt;
&lt;p&gt;Migrating it to an easier, more manageable tool seemed to be the best middle-ground.&lt;/p&gt;
&lt;h2 id=&quot;zensical&quot;&gt;Zensical&lt;/h2&gt;
&lt;p&gt;Well, a couple of years ago, I started using &lt;a href=&quot;https://squidfunk.github.io/mkdocs-material/&quot;&gt;Material for Mkdocs&lt;/a&gt; at work for a wiki, and I really liked it.&lt;/p&gt;
&lt;p&gt;Recently, there was a split in the Mkdocs community: Mkdocs is moving to a 2.0 version that&apos;s not backward compatible with most extensions. &lt;/p&gt;
&lt;p&gt;Because of that, &lt;a href=&quot;../posts/Zensical.org/&quot;&gt;Zensical&lt;/a&gt; was created as a spiritual successor which is backward-compatible.&lt;/p&gt;
&lt;p&gt;If you&apos;re not familiar with Zensical/Mkdocs, they basically allow writing blogs/wiki articles as markdown files, and provide tooling to generate your site as basic HTML/CSS/JS. The result is very fast loading times, and no real security risks.&lt;/p&gt;
&lt;p&gt;So that ticks all the boxes.&lt;/p&gt;
&lt;p&gt;But you might be wondering (who am I kidding, no one is reading this), why am I doing this only now if I discovered Mkdocs years ago?&lt;/p&gt;
&lt;h2 id=&quot;claude-code&quot;&gt;Claude Code&lt;/h2&gt;
&lt;p&gt;Well, the elephant in the room nowadays in any tech conversation is AI, of course.&lt;/p&gt;
&lt;p&gt;One thing I realised lately is how easy it now is to actually tackle the backlog of side project ideas I just never had the motivation to go through, thanks to LLMs.&lt;/p&gt;
&lt;p&gt;Another thing I realised once I decided to try that is how quickly I (well, Claude) got that done! It really took about &lt;strong&gt;30 min total&lt;/strong&gt; from the moment I explained the migration plan to the moment the new version was deployed live. &lt;/p&gt;
&lt;p&gt;Before AI, this would have taken me between 5 to 10 hours.&lt;/p&gt;
&lt;p&gt;...what a world we live in!&lt;/p&gt;</description><link>https://blog.detassigny.net/zensical-migration/</link><source url="https://blog.detassigny.net/feed_rss_created.xml">$&gt; blog detassigny.net</source><pubDate>Mon, 12 Oct 2026 00:00:00 +0000</pubDate><guid isPermaLink="true">https://blog.detassigny.net/zensical-migration/</guid></item><item><title>Safe Refactoring: split a class into smaller ones</title><author>Gabriel de Tassigny</author><description>&lt;h1 id=&quot;safe-refactoring-split-a-class-into-smaller-ones&quot;&gt;Safe Refactoring: split a class into smaller ones&lt;/h1&gt;
&lt;p&gt;A step-by-step guide on how to refactor big chunks of code using unit tests&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;Refactoring is hard! You most likely want to refactor old spaghetti code that you may or may not understand. There is a risk that you break everything in the process because of the complexity and potential edge cases that you didn&apos;t think about.&lt;/p&gt;
&lt;p&gt;There are multiple ways to refactor old code and it also depends on what kind of code we&apos;re looking at improving (multiple classes and modules? a single class? old procedural code?).&lt;/p&gt;
&lt;p&gt;In this guide, I will explain my general process when specifically looking at refactoring a single large class with the aim to split it into smaller ones. More importantly, I will explain how to do it in a &lt;strong&gt;safe way&lt;/strong&gt; that should hopefully give you enough confidence to deploy your new changes without breaking anything.&lt;/p&gt;
&lt;h2 id=&quot;case-study&quot;&gt;Case study&lt;/h2&gt;
&lt;p&gt;Let&apos;s imagine we have the following class we wish to refactor:&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-0-1&quot; name=&quot;__codelineno-0-1&quot; href=&quot;#__codelineno-0-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\Controller&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-2&quot; name=&quot;__codelineno-0-2&quot; href=&quot;#__codelineno-0-2&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-3&quot; name=&quot;__codelineno-0-3&quot; href=&quot;#__codelineno-0-3&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-4&quot; name=&quot;__codelineno-0-4&quot; href=&quot;#__codelineno-0-4&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\PostRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-5&quot; name=&quot;__codelineno-0-5&quot; href=&quot;#__codelineno-0-5&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Psr\Log\LoggerInterface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-6&quot; name=&quot;__codelineno-0-6&quot; href=&quot;#__codelineno-0-6&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-7&quot; name=&quot;__codelineno-0-7&quot; href=&quot;#__codelineno-0-7&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PostController&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-8&quot; name=&quot;__codelineno-0-8&quot; href=&quot;#__codelineno-0-8&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-9&quot; name=&quot;__codelineno-0-9&quot; href=&quot;#__codelineno-0-9&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PostRepository&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$repository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-10&quot; name=&quot;__codelineno-0-10&quot; href=&quot;#__codelineno-0-10&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;LoggerInterface&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-11&quot; name=&quot;__codelineno-0-11&quot; href=&quot;#__codelineno-0-11&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-12&quot; name=&quot;__codelineno-0-12&quot; href=&quot;#__codelineno-0-12&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;fm&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;PostRepository&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;LoggerInterface&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-13&quot; name=&quot;__codelineno-0-13&quot; href=&quot;#__codelineno-0-13&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-14&quot; name=&quot;__codelineno-0-14&quot; href=&quot;#__codelineno-0-14&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;repository&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-15&quot; name=&quot;__codelineno-0-15&quot; href=&quot;#__codelineno-0-15&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;logger&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-16&quot; name=&quot;__codelineno-0-16&quot; href=&quot;#__codelineno-0-16&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-17&quot; name=&quot;__codelineno-0-17&quot; href=&quot;#__codelineno-0-17&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-18&quot; name=&quot;__codelineno-0-18&quot; href=&quot;#__codelineno-0-18&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getPostData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;array&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-19&quot; name=&quot;__codelineno-0-19&quot; href=&quot;#__codelineno-0-19&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-20&quot; name=&quot;__codelineno-0-20&quot; href=&quot;#__codelineno-0-20&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;isset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;id&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-21&quot; name=&quot;__codelineno-0-21&quot; href=&quot;#__codelineno-0-21&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;\InvalidArgumentException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;Missing id parameter&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-22&quot; name=&quot;__codelineno-0-22&quot; href=&quot;#__codelineno-0-22&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-23&quot; name=&quot;__codelineno-0-23&quot; href=&quot;#__codelineno-0-23&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-24&quot; name=&quot;__codelineno-0-24&quot; href=&quot;#__codelineno-0-24&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;id&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-25&quot; name=&quot;__codelineno-0-25&quot; href=&quot;#__codelineno-0-25&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-26&quot; name=&quot;__codelineno-0-26&quot; href=&quot;#__codelineno-0-26&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;\InvalidArgumentException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;Invalid id parameter&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-27&quot; name=&quot;__codelineno-0-27&quot; href=&quot;#__codelineno-0-27&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-28&quot; name=&quot;__codelineno-0-28&quot; href=&quot;#__codelineno-0-28&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-29&quot; name=&quot;__codelineno-0-29&quot; href=&quot;#__codelineno-0-29&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;sd&quot;&gt;/** @var Post|null $post */&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-30&quot; name=&quot;__codelineno-0-30&quot; href=&quot;#__codelineno-0-30&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-31&quot; name=&quot;__codelineno-0-31&quot; href=&quot;#__codelineno-0-31&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;is_null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-32&quot; name=&quot;__codelineno-0-32&quot; href=&quot;#__codelineno-0-32&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;warning&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Post with &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; was not found&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-33&quot; name=&quot;__codelineno-0-33&quot; href=&quot;#__codelineno-0-33&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;\RuntimeException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Post with &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; was not found&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-34&quot; name=&quot;__codelineno-0-34&quot; href=&quot;#__codelineno-0-34&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-35&quot; name=&quot;__codelineno-0-35&quot; href=&quot;#__codelineno-0-35&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-36&quot; name=&quot;__codelineno-0-36&quot; href=&quot;#__codelineno-0-36&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;json_encode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-37&quot; name=&quot;__codelineno-0-37&quot; href=&quot;#__codelineno-0-37&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;s1&quot;&gt;&apos;id&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-38&quot; name=&quot;__codelineno-0-38&quot; href=&quot;#__codelineno-0-38&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;s1&quot;&gt;&apos;text&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getText&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-39&quot; name=&quot;__codelineno-0-39&quot; href=&quot;#__codelineno-0-39&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-40&quot; name=&quot;__codelineno-0-40&quot; href=&quot;#__codelineno-0-40&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-41&quot; name=&quot;__codelineno-0-41&quot; href=&quot;#__codelineno-0-41&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It&apos;s a fairly large controller for a homemade API. It does a lot of things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;it verifies the validity of the ID parameter and throws an exception in case it&apos;s not valid&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;it uses Doctrine&apos;s repository to fetch the post entity.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;if the repository fails to get the data, it logs an error, and throws a runtime exception&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;finally, if all went fine, it returns a json encoded response of the post data&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, you may tell me &quot;Well my work examples are more complex than that!&quot; and you would be right... But obviously I keep the example simple enough so that it&apos;s not too complicated to explain the process. But the concept should be the same regardless.&lt;/p&gt;
&lt;h2 id=&quot;unit-test-coverage&quot;&gt;Unit test coverage&lt;/h2&gt;
&lt;p&gt;Now that we know roughly what our class does, the first thing to do (if not already available) is to cover its behaviour with unit tests! We&apos;ll be using &lt;strong&gt;PHPUnit&lt;/strong&gt; for the tests and &lt;strong&gt;Mockery&lt;/strong&gt; to mock the dependencies.&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-1-1&quot; name=&quot;__codelineno-1-1&quot; href=&quot;#__codelineno-1-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\Tests\Controller&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-2&quot; name=&quot;__codelineno-1-2&quot; href=&quot;#__codelineno-1-2&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-3&quot; name=&quot;__codelineno-1-3&quot; href=&quot;#__codelineno-1-3&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\Controller\PostController&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-4&quot; name=&quot;__codelineno-1-4&quot; href=&quot;#__codelineno-1-4&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-5&quot; name=&quot;__codelineno-1-5&quot; href=&quot;#__codelineno-1-5&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\PostRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-6&quot; name=&quot;__codelineno-1-6&quot; href=&quot;#__codelineno-1-6&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Mockery&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-7&quot; name=&quot;__codelineno-1-7&quot; href=&quot;#__codelineno-1-7&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-8&quot; name=&quot;__codelineno-1-8&quot; href=&quot;#__codelineno-1-8&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PHPUnit\Framework\TestCase&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-9&quot; name=&quot;__codelineno-1-9&quot; href=&quot;#__codelineno-1-9&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Psr\Log\LoggerInterface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-10&quot; name=&quot;__codelineno-1-10&quot; href=&quot;#__codelineno-1-10&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-11&quot; name=&quot;__codelineno-1-11&quot; href=&quot;#__codelineno-1-11&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PostControllerTest&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;TestCase&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-12&quot; name=&quot;__codelineno-1-12&quot; href=&quot;#__codelineno-1-12&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-13&quot; name=&quot;__codelineno-1-13&quot; href=&quot;#__codelineno-1-13&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MockeryPHPUnitIntegration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-14&quot; name=&quot;__codelineno-1-14&quot; href=&quot;#__codelineno-1-14&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-15&quot; name=&quot;__codelineno-1-15&quot; href=&quot;#__codelineno-1-15&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;POST_ID&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-16&quot; name=&quot;__codelineno-1-16&quot; href=&quot;#__codelineno-1-16&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-17&quot; name=&quot;__codelineno-1-17&quot; href=&quot;#__codelineno-1-17&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PostRepository&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$repository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-18&quot; name=&quot;__codelineno-1-18&quot; href=&quot;#__codelineno-1-18&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;LoggerInterface&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-19&quot; name=&quot;__codelineno-1-19&quot; href=&quot;#__codelineno-1-19&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PostController&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$controller&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-20&quot; name=&quot;__codelineno-1-20&quot; href=&quot;#__codelineno-1-20&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-21&quot; name=&quot;__codelineno-1-21&quot; href=&quot;#__codelineno-1-21&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;setUp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-22&quot; name=&quot;__codelineno-1-22&quot; href=&quot;#__codelineno-1-22&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-23&quot; name=&quot;__codelineno-1-23&quot; href=&quot;#__codelineno-1-23&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;repository&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Mockery&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;mock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;PostRepository&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-24&quot; name=&quot;__codelineno-1-24&quot; href=&quot;#__codelineno-1-24&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;logger&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Mockery&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;mock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;LoggerInterface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-25&quot; name=&quot;__codelineno-1-25&quot; href=&quot;#__codelineno-1-25&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-26&quot; name=&quot;__codelineno-1-26&quot; href=&quot;#__codelineno-1-26&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;controller&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PostController&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-27&quot; name=&quot;__codelineno-1-27&quot; href=&quot;#__codelineno-1-27&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-28&quot; name=&quot;__codelineno-1-28&quot; href=&quot;#__codelineno-1-28&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-29&quot; name=&quot;__codelineno-1-29&quot; href=&quot;#__codelineno-1-29&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/**&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-30&quot; name=&quot;__codelineno-1-30&quot; href=&quot;#__codelineno-1-30&quot;&gt;&lt;/a&gt;&lt;span class=&quot;sd&quot;&gt;     * @dataProvider invalidParamsDataProvider&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-31&quot; name=&quot;__codelineno-1-31&quot; href=&quot;#__codelineno-1-31&quot;&gt;&lt;/a&gt;&lt;span class=&quot;sd&quot;&gt;     */&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-32&quot; name=&quot;__codelineno-1-32&quot; href=&quot;#__codelineno-1-32&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testGetPostDataThrowsErrorForInvalidParams&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;array&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-33&quot; name=&quot;__codelineno-1-33&quot; href=&quot;#__codelineno-1-33&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-34&quot; name=&quot;__codelineno-1-34&quot; href=&quot;#__codelineno-1-34&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;expectException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;\InvalidArgumentException&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-35&quot; name=&quot;__codelineno-1-35&quot; href=&quot;#__codelineno-1-35&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;expectExceptionMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-36&quot; name=&quot;__codelineno-1-36&quot; href=&quot;#__codelineno-1-36&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-37&quot; name=&quot;__codelineno-1-37&quot; href=&quot;#__codelineno-1-37&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;controller&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getPostData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-38&quot; name=&quot;__codelineno-1-38&quot; href=&quot;#__codelineno-1-38&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-39&quot; name=&quot;__codelineno-1-39&quot; href=&quot;#__codelineno-1-39&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-40&quot; name=&quot;__codelineno-1-40&quot; href=&quot;#__codelineno-1-40&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;invalidParamsDataProvider&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-41&quot; name=&quot;__codelineno-1-41&quot; href=&quot;#__codelineno-1-41&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-42&quot; name=&quot;__codelineno-1-42&quot; href=&quot;#__codelineno-1-42&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-43&quot; name=&quot;__codelineno-1-43&quot; href=&quot;#__codelineno-1-43&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;s1&quot;&gt;&apos;Id is missing&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[[],&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;Missing id parameter&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-44&quot; name=&quot;__codelineno-1-44&quot; href=&quot;#__codelineno-1-44&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;s1&quot;&gt;&apos;Id is null&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;id&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;Missing id parameter&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-45&quot; name=&quot;__codelineno-1-45&quot; href=&quot;#__codelineno-1-45&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;s1&quot;&gt;&apos;Id is set to zero&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;id&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;Invalid id parameter&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-46&quot; name=&quot;__codelineno-1-46&quot; href=&quot;#__codelineno-1-46&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;s1&quot;&gt;&apos;Id is set to a string&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;id&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;invalid&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;Invalid id parameter&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-47&quot; name=&quot;__codelineno-1-47&quot; href=&quot;#__codelineno-1-47&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-48&quot; name=&quot;__codelineno-1-48&quot; href=&quot;#__codelineno-1-48&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-49&quot; name=&quot;__codelineno-1-49&quot; href=&quot;#__codelineno-1-49&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-50&quot; name=&quot;__codelineno-1-50&quot; href=&quot;#__codelineno-1-50&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testGetPostDataThrowsErrorIfPostNotFound&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-51&quot; name=&quot;__codelineno-1-51&quot; href=&quot;#__codelineno-1-51&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-52&quot; name=&quot;__codelineno-1-52&quot; href=&quot;#__codelineno-1-52&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;allows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;find&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;POST_ID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;andReturn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-53&quot; name=&quot;__codelineno-1-53&quot; href=&quot;#__codelineno-1-53&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-54&quot; name=&quot;__codelineno-1-54&quot; href=&quot;#__codelineno-1-54&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$errorMessage&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;Post with id &apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;POST_ID&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos; was not found&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-55&quot; name=&quot;__codelineno-1-55&quot; href=&quot;#__codelineno-1-55&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-56&quot; name=&quot;__codelineno-1-56&quot; href=&quot;#__codelineno-1-56&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;expectException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;\RuntimeException&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-57&quot; name=&quot;__codelineno-1-57&quot; href=&quot;#__codelineno-1-57&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;expectExceptionMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$errorMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-58&quot; name=&quot;__codelineno-1-58&quot; href=&quot;#__codelineno-1-58&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-59&quot; name=&quot;__codelineno-1-59&quot; href=&quot;#__codelineno-1-59&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;expects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;warning&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$errorMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-60&quot; name=&quot;__codelineno-1-60&quot; href=&quot;#__codelineno-1-60&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-61&quot; name=&quot;__codelineno-1-61&quot; href=&quot;#__codelineno-1-61&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;controller&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getPostData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;id&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-62&quot; name=&quot;__codelineno-1-62&quot; href=&quot;#__codelineno-1-62&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-63&quot; name=&quot;__codelineno-1-63&quot; href=&quot;#__codelineno-1-63&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-64&quot; name=&quot;__codelineno-1-64&quot; href=&quot;#__codelineno-1-64&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testGetPostDataReturnsJsonEncodedPostData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-65&quot; name=&quot;__codelineno-1-65&quot; href=&quot;#__codelineno-1-65&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-66&quot; name=&quot;__codelineno-1-66&quot; href=&quot;#__codelineno-1-66&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$expected&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;{&quot;id&quot;:1,&quot;text&quot;:&quot;some text from the post&quot;}&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-67&quot; name=&quot;__codelineno-1-67&quot; href=&quot;#__codelineno-1-67&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-68&quot; name=&quot;__codelineno-1-68&quot; href=&quot;#__codelineno-1-68&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Mockery&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;mock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-69&quot; name=&quot;__codelineno-1-69&quot; href=&quot;#__codelineno-1-69&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;allows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;getId&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;andReturn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;POST_ID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-70&quot; name=&quot;__codelineno-1-70&quot; href=&quot;#__codelineno-1-70&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;allows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;getText&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;andReturn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;some text from the post&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-71&quot; name=&quot;__codelineno-1-71&quot; href=&quot;#__codelineno-1-71&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-72&quot; name=&quot;__codelineno-1-72&quot; href=&quot;#__codelineno-1-72&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;allows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;find&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;POST_ID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;andReturn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-73&quot; name=&quot;__codelineno-1-73&quot; href=&quot;#__codelineno-1-73&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-74&quot; name=&quot;__codelineno-1-74&quot; href=&quot;#__codelineno-1-74&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$actual&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;controller&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getPostData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;id&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-75&quot; name=&quot;__codelineno-1-75&quot; href=&quot;#__codelineno-1-75&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-76&quot; name=&quot;__codelineno-1-76&quot; href=&quot;#__codelineno-1-76&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;assertJsonStringEqualsJsonString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$expected&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$actual&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-77&quot; name=&quot;__codelineno-1-77&quot; href=&quot;#__codelineno-1-77&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-78&quot; name=&quot;__codelineno-1-78&quot; href=&quot;#__codelineno-1-78&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You should try to cover all paths of your code. In this example, we make sure to cover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;invalid parameters (using a &lt;a href=&quot;https://phpunit.readthedocs.io/en/9.5/writing-tests-for-phpunit.html?highlight=data%20provider#data-providers&quot;&gt;data provider&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;error handling for a post not found&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;the successful scenario: the post is retrieved and formatted in JSON&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to ensure that all paths are properly covered, several metrics and tools could potentially help you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://phpunit.readthedocs.io/en/9.5/code-coverage-analysis.html&quot;&gt;code coverage&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://infection.github.io/guide/&quot;&gt;mutation testing&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But of course manually looking at it may be enough, depending on the size and complexity of the class.&lt;/p&gt;
&lt;h2 id=&quot;refactoring&quot;&gt;Refactoring&lt;/h2&gt;
&lt;p&gt;We&apos;re now in a position where we&apos;ve defined our expected behaviour (with unit tests) and can therefore validate if our refactor will be successful.&lt;/p&gt;
&lt;p&gt;There are many ways we could go at simplifying this controller code, but here is my take on it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;the parameter validation could be taken out and done in a &lt;a href=&quot;../design-pattern-1-value-object/&quot;&gt;value object&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;there is too much logic of doctrine repository and logging for a simple controller. Let&apos;s build a service that deals with that instead.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;First, here is the PostId value object:&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-2-1&quot; name=&quot;__codelineno-2-1&quot; href=&quot;#__codelineno-2-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\Value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-2&quot; name=&quot;__codelineno-2-2&quot; href=&quot;#__codelineno-2-2&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-3&quot; name=&quot;__codelineno-2-3&quot; href=&quot;#__codelineno-2-3&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PostId&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-4&quot; name=&quot;__codelineno-2-4&quot; href=&quot;#__codelineno-2-4&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-5&quot; name=&quot;__codelineno-2-5&quot; href=&quot;#__codelineno-2-5&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-6&quot; name=&quot;__codelineno-2-6&quot; href=&quot;#__codelineno-2-6&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-7&quot; name=&quot;__codelineno-2-7&quot; href=&quot;#__codelineno-2-7&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;fm&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;array&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-8&quot; name=&quot;__codelineno-2-8&quot; href=&quot;#__codelineno-2-8&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-9&quot; name=&quot;__codelineno-2-9&quot; href=&quot;#__codelineno-2-9&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;isset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;id&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-10&quot; name=&quot;__codelineno-2-10&quot; href=&quot;#__codelineno-2-10&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;\InvalidArgumentException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;Missing id parameter&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-11&quot; name=&quot;__codelineno-2-11&quot; href=&quot;#__codelineno-2-11&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-12&quot; name=&quot;__codelineno-2-12&quot; href=&quot;#__codelineno-2-12&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-13&quot; name=&quot;__codelineno-2-13&quot; href=&quot;#__codelineno-2-13&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;id&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-14&quot; name=&quot;__codelineno-2-14&quot; href=&quot;#__codelineno-2-14&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;\InvalidArgumentException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;Invalid id parameter&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-15&quot; name=&quot;__codelineno-2-15&quot; href=&quot;#__codelineno-2-15&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-16&quot; name=&quot;__codelineno-2-16&quot; href=&quot;#__codelineno-2-16&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-17&quot; name=&quot;__codelineno-2-17&quot; href=&quot;#__codelineno-2-17&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;id&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-18&quot; name=&quot;__codelineno-2-18&quot; href=&quot;#__codelineno-2-18&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-19&quot; name=&quot;__codelineno-2-19&quot; href=&quot;#__codelineno-2-19&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-20&quot; name=&quot;__codelineno-2-20&quot; href=&quot;#__codelineno-2-20&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;int&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-21&quot; name=&quot;__codelineno-2-21&quot; href=&quot;#__codelineno-2-21&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-22&quot; name=&quot;__codelineno-2-22&quot; href=&quot;#__codelineno-2-22&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-23&quot; name=&quot;__codelineno-2-23&quot; href=&quot;#__codelineno-2-23&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-24&quot; name=&quot;__codelineno-2-24&quot; href=&quot;#__codelineno-2-24&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It includes all our check for the parameters that the controller used to do.&lt;/p&gt;
&lt;p&gt;Now let&apos;s add a post service that deals with fetching the post using doctrine, and logging a warning if it&apos;s not found:&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-3-1&quot; name=&quot;__codelineno-3-1&quot; href=&quot;#__codelineno-3-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-2&quot; name=&quot;__codelineno-3-2&quot; href=&quot;#__codelineno-3-2&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-3-3&quot; name=&quot;__codelineno-3-3&quot; href=&quot;#__codelineno-3-3&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\Value\PostId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-4&quot; name=&quot;__codelineno-3-4&quot; href=&quot;#__codelineno-3-4&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Psr\Log\LoggerInterface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-5&quot; name=&quot;__codelineno-3-5&quot; href=&quot;#__codelineno-3-5&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-3-6&quot; name=&quot;__codelineno-3-6&quot; href=&quot;#__codelineno-3-6&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PostService&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-7&quot; name=&quot;__codelineno-3-7&quot; href=&quot;#__codelineno-3-7&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-8&quot; name=&quot;__codelineno-3-8&quot; href=&quot;#__codelineno-3-8&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PostRepository&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$repository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-9&quot; name=&quot;__codelineno-3-9&quot; href=&quot;#__codelineno-3-9&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;LoggerInterface&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-10&quot; name=&quot;__codelineno-3-10&quot; href=&quot;#__codelineno-3-10&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-3-11&quot; name=&quot;__codelineno-3-11&quot; href=&quot;#__codelineno-3-11&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;fm&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;PostRepository&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$repository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;LoggerInterface&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-12&quot; name=&quot;__codelineno-3-12&quot; href=&quot;#__codelineno-3-12&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-13&quot; name=&quot;__codelineno-3-13&quot; href=&quot;#__codelineno-3-13&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;repository&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$repository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-14&quot; name=&quot;__codelineno-3-14&quot; href=&quot;#__codelineno-3-14&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;logger&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-15&quot; name=&quot;__codelineno-3-15&quot; href=&quot;#__codelineno-3-15&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-16&quot; name=&quot;__codelineno-3-16&quot; href=&quot;#__codelineno-3-16&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-3-17&quot; name=&quot;__codelineno-3-17&quot; href=&quot;#__codelineno-3-17&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;PostId&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-18&quot; name=&quot;__codelineno-3-18&quot; href=&quot;#__codelineno-3-18&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-19&quot; name=&quot;__codelineno-3-19&quot; href=&quot;#__codelineno-3-19&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;sd&quot;&gt;/** @var Post|null $post */&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-20&quot; name=&quot;__codelineno-3-20&quot; href=&quot;#__codelineno-3-20&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$postId&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-21&quot; name=&quot;__codelineno-3-21&quot; href=&quot;#__codelineno-3-21&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;is_null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-22&quot; name=&quot;__codelineno-3-22&quot; href=&quot;#__codelineno-3-22&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;warning&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Post with id &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$postId&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; was not found&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-23&quot; name=&quot;__codelineno-3-23&quot; href=&quot;#__codelineno-3-23&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;\RuntimeException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Post with id &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$postId&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; was not found&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-24&quot; name=&quot;__codelineno-3-24&quot; href=&quot;#__codelineno-3-24&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-25&quot; name=&quot;__codelineno-3-25&quot; href=&quot;#__codelineno-3-25&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-3-26&quot; name=&quot;__codelineno-3-26&quot; href=&quot;#__codelineno-3-26&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-27&quot; name=&quot;__codelineno-3-27&quot; href=&quot;#__codelineno-3-27&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-28&quot; name=&quot;__codelineno-3-28&quot; href=&quot;#__codelineno-3-28&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Perfect!&lt;/p&gt;
&lt;p&gt;Now we can simplify our controller to use these two classes:&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-4-1&quot; name=&quot;__codelineno-4-1&quot; href=&quot;#__codelineno-4-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\Controller&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-2&quot; name=&quot;__codelineno-4-2&quot; href=&quot;#__codelineno-4-2&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-4-3&quot; name=&quot;__codelineno-4-3&quot; href=&quot;#__codelineno-4-3&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\PostService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-4&quot; name=&quot;__codelineno-4-4&quot; href=&quot;#__codelineno-4-4&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\Value\PostId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-5&quot; name=&quot;__codelineno-4-5&quot; href=&quot;#__codelineno-4-5&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-4-6&quot; name=&quot;__codelineno-4-6&quot; href=&quot;#__codelineno-4-6&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PostController&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-7&quot; name=&quot;__codelineno-4-7&quot; href=&quot;#__codelineno-4-7&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-8&quot; name=&quot;__codelineno-4-8&quot; href=&quot;#__codelineno-4-8&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var PostService */&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-9&quot; name=&quot;__codelineno-4-9&quot; href=&quot;#__codelineno-4-9&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PostService&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-10&quot; name=&quot;__codelineno-4-10&quot; href=&quot;#__codelineno-4-10&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-4-11&quot; name=&quot;__codelineno-4-11&quot; href=&quot;#__codelineno-4-11&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;fm&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;PostService&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-12&quot; name=&quot;__codelineno-4-12&quot; href=&quot;#__codelineno-4-12&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-13&quot; name=&quot;__codelineno-4-13&quot; href=&quot;#__codelineno-4-13&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postService&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-14&quot; name=&quot;__codelineno-4-14&quot; href=&quot;#__codelineno-4-14&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-15&quot; name=&quot;__codelineno-4-15&quot; href=&quot;#__codelineno-4-15&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-4-16&quot; name=&quot;__codelineno-4-16&quot; href=&quot;#__codelineno-4-16&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getPostData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;array&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-17&quot; name=&quot;__codelineno-4-17&quot; href=&quot;#__codelineno-4-17&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-18&quot; name=&quot;__codelineno-4-18&quot; href=&quot;#__codelineno-4-18&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$postId&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PostId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-19&quot; name=&quot;__codelineno-4-19&quot; href=&quot;#__codelineno-4-19&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postService&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$postId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-20&quot; name=&quot;__codelineno-4-20&quot; href=&quot;#__codelineno-4-20&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-4-21&quot; name=&quot;__codelineno-4-21&quot; href=&quot;#__codelineno-4-21&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;json_encode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-22&quot; name=&quot;__codelineno-4-22&quot; href=&quot;#__codelineno-4-22&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;s1&quot;&gt;&apos;id&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-23&quot; name=&quot;__codelineno-4-23&quot; href=&quot;#__codelineno-4-23&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;s1&quot;&gt;&apos;text&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getText&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-24&quot; name=&quot;__codelineno-4-24&quot; href=&quot;#__codelineno-4-24&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-25&quot; name=&quot;__codelineno-4-25&quot; href=&quot;#__codelineno-4-25&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-26&quot; name=&quot;__codelineno-4-26&quot; href=&quot;#__codelineno-4-26&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, that&apos;s an easy to read controller! We could also take out the json formatting into a separate class, but that will do for the purpose of this exercise.&lt;/p&gt;
&lt;h2 id=&quot;updating-the-tests&quot;&gt;Updating the tests&lt;/h2&gt;
&lt;p&gt;If you try running the tests now, it will fail because the controller dependencies have changed!&lt;/p&gt;
&lt;p&gt;However, none of our logic actually has been modified: the code is doing the same thing as before.&lt;/p&gt;
&lt;p&gt;This is probably the most important step, and yet if the refactor is done right, it&apos;s the simplest:&lt;/p&gt;
&lt;p&gt;Instead of directly start writing tests for the new classes, and completely rewrite the existing ones, we need to slightly change the controller tests to prove that it still works. To do so, we&apos;ll only change the dependencies but without mocking them! Let it actually use the PostService properly, but we&apos;ll keep mocking the logger and the repository as before.&lt;/p&gt;
&lt;p&gt;Our only change should therefore be to modify the &lt;strong&gt;PostController&lt;/strong&gt; instanciation in the &lt;strong&gt;setUp&lt;/strong&gt; method:&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-5-1&quot; name=&quot;__codelineno-5-1&quot; href=&quot;#__codelineno-5-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;controller&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PostController&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PostService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That&apos;s it! The tests still pass! We&apos;ve now refactored everything and we&apos;re fairly confident that the behaviour hasn&apos;t changed.&lt;/p&gt;
&lt;h2 id=&quot;what-next&quot;&gt;What next?&lt;/h2&gt;
&lt;p&gt;Well, you could leave it like that, but most likely you may want to start writing tests for the &lt;strong&gt;PostService&lt;/strong&gt; and then simplify the &lt;strong&gt;PostControllerTest&lt;/strong&gt; by mocking the service and removing any mentions of the logger and repository. That way, not only your production code, but also your tests are simplified.&lt;/p&gt;</description><link>https://blog.detassigny.net/safe-refactoring-split-a-class-into-smaller-ones/</link><source url="https://blog.detassigny.net/feed_rss_created.xml">$&gt; blog detassigny.net</source><pubDate>Fri, 25 Jun 2021 08:35:07 +0000</pubDate><guid isPermaLink="true">https://blog.detassigny.net/safe-refactoring-split-a-class-into-smaller-ones/</guid></item><item><title>Design Pattern #3: Decorator Pattern</title><author>Gabriel de Tassigny</author><description>&lt;h1 id=&quot;design-pattern-3-decorator-pattern&quot;&gt;Design Pattern #3: Decorator Pattern&lt;/h1&gt;
&lt;p&gt;A pattern with a similar purpose to inheritance, but with some advantages!&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;I have used the decorator design pattern a few times recently, and while it&apos;s simple and useful, it&apos;s surprisingly not that often applied.&lt;/p&gt;
&lt;p&gt;Therefore, I decided to write a small post detailing how it works, and why you could potentially use it.&lt;/p&gt;
&lt;h2 id=&quot;whats-the-decorator-pattern&quot;&gt;What&apos;s the decorator pattern?&lt;/h2&gt;
&lt;p&gt;The concept of a decorator pattern is fairly simple: let&apos;s imagine that you already have an established concrete class (like a service) doing something and this class implements some interface. You want to add a piece of extra functionality to it but that work isn&apos;t a must-have, just something to add on top. You could either:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;add your changes to the existing class&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;extend the class with a new child class&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;use the &lt;strong&gt;decorator pattern&lt;/strong&gt;: You create a new class that will implement the same interface, and receive the original class (i.e. the decorated class) as a parameter using &lt;a href=&quot;../design-pattern-2-dependency-injection/&quot;&gt;dependency injection&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each option has its pros and cons, but let&apos;s see in practice how you would use the decorator pattern.&lt;/p&gt;
&lt;h2 id=&quot;example&quot;&gt;Example&lt;/h2&gt;
&lt;h3 id=&quot;decorated-class&quot;&gt;Decorated class&lt;/h3&gt;
&lt;p&gt;Let&apos;s say we have a service that sends an email (this will be our decorated class) and it extends an interface:&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-0-1&quot; name=&quot;__codelineno-0-1&quot; href=&quot;#__codelineno-0-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MailSenderInterface&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-2&quot; name=&quot;__codelineno-0-2&quot; href=&quot;#__codelineno-0-2&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-3&quot; name=&quot;__codelineno-0-3&quot; href=&quot;#__codelineno-0-3&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;sendEmail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$destination&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$subject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;bool&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-4&quot; name=&quot;__codelineno-0-4&quot; href=&quot;#__codelineno-0-4&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-5&quot; name=&quot;__codelineno-0-5&quot; href=&quot;#__codelineno-0-5&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-6&quot; name=&quot;__codelineno-0-6&quot; href=&quot;#__codelineno-0-6&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MailSenderService&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MailSenderInterface&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-7&quot; name=&quot;__codelineno-0-7&quot; href=&quot;#__codelineno-0-7&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-8&quot; name=&quot;__codelineno-0-8&quot; href=&quot;#__codelineno-0-8&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;sendEmail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$destination&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$subject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;bool&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-9&quot; name=&quot;__codelineno-0-9&quot; href=&quot;#__codelineno-0-9&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-10&quot; name=&quot;__codelineno-0-10&quot; href=&quot;#__codelineno-0-10&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;mail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$destination&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$subject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-11&quot; name=&quot;__codelineno-0-11&quot; href=&quot;#__codelineno-0-11&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-12&quot; name=&quot;__codelineno-0-12&quot; href=&quot;#__codelineno-0-12&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;decorator-class&quot;&gt;Decorator class&lt;/h3&gt;
&lt;p&gt;Now, we realise that in some cases we want to log an error in case the mail failed to be sent. Let&apos;s use our decorator pattern to do that!&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-1-1&quot; name=&quot;__codelineno-1-1&quot; href=&quot;#__codelineno-1-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ErrorLoggerDecorator&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MailSenderInterface&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-2&quot; name=&quot;__codelineno-1-2&quot; href=&quot;#__codelineno-1-2&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-3&quot; name=&quot;__codelineno-1-3&quot; href=&quot;#__codelineno-1-3&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MailSenderInterface&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$decorated&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-4&quot; name=&quot;__codelineno-1-4&quot; href=&quot;#__codelineno-1-4&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;LoggerInterface&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-5&quot; name=&quot;__codelineno-1-5&quot; href=&quot;#__codelineno-1-5&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-6&quot; name=&quot;__codelineno-1-6&quot; href=&quot;#__codelineno-1-6&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;fm&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;MailSenderInterface&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$decorated&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;LoggerInterface&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-7&quot; name=&quot;__codelineno-1-7&quot; href=&quot;#__codelineno-1-7&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-8&quot; name=&quot;__codelineno-1-8&quot; href=&quot;#__codelineno-1-8&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;decorated&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$decorated&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-9&quot; name=&quot;__codelineno-1-9&quot; href=&quot;#__codelineno-1-9&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;logger&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-10&quot; name=&quot;__codelineno-1-10&quot; href=&quot;#__codelineno-1-10&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-11&quot; name=&quot;__codelineno-1-11&quot; href=&quot;#__codelineno-1-11&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-12&quot; name=&quot;__codelineno-1-12&quot; href=&quot;#__codelineno-1-12&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;sendEmail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$destination&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$subject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;bool&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-13&quot; name=&quot;__codelineno-1-13&quot; href=&quot;#__codelineno-1-13&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-14&quot; name=&quot;__codelineno-1-14&quot; href=&quot;#__codelineno-1-14&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;decorated&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;sendEmail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$destination&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$subject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-15&quot; name=&quot;__codelineno-1-15&quot; href=&quot;#__codelineno-1-15&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-16&quot; name=&quot;__codelineno-1-16&quot; href=&quot;#__codelineno-1-16&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-17&quot; name=&quot;__codelineno-1-17&quot; href=&quot;#__codelineno-1-17&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;Failed to send e-mail to &apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$destination&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-18&quot; name=&quot;__codelineno-1-18&quot; href=&quot;#__codelineno-1-18&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-19&quot; name=&quot;__codelineno-1-19&quot; href=&quot;#__codelineno-1-19&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-20&quot; name=&quot;__codelineno-1-20&quot; href=&quot;#__codelineno-1-20&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-21&quot; name=&quot;__codelineno-1-21&quot; href=&quot;#__codelineno-1-21&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That&apos;s it! we inject our decorated class into it, use it to do the job of sending the email, and in case it failed we log an error using our application logger.&lt;/p&gt;
&lt;p&gt;Now, you could say that we could have done that directly in the decorated class, but perhaps your mail sender service is used multiple times in your application and you want to log one specific instance only.&lt;/p&gt;
&lt;p&gt;Also, this is more in line with &lt;a href=&quot;https://en.wikipedia.org/wiki/SOLID&quot;&gt;SOLID Principles&lt;/a&gt;: each class does one thing only, and you&apos;re extending instead of modifying your existing code.&lt;/p&gt;
&lt;h3 id=&quot;make-your-application-use-it&quot;&gt;Make your application use it&lt;/h3&gt;
&lt;p&gt;If your application is well structured, other parts of the code would hopefully already reference the interface instead of the decorated class. For example:&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-2-1&quot; name=&quot;__codelineno-2-1&quot; href=&quot;#__codelineno-2-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MailSendingController&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-2&quot; name=&quot;__codelineno-2-2&quot; href=&quot;#__codelineno-2-2&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-3&quot; name=&quot;__codelineno-2-3&quot; href=&quot;#__codelineno-2-3&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MailSenderInterface&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$mailSender&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-4&quot; name=&quot;__codelineno-2-4&quot; href=&quot;#__codelineno-2-4&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-5&quot; name=&quot;__codelineno-2-5&quot; href=&quot;#__codelineno-2-5&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;fm&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;MailSenderInterface&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$mailSender&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-6&quot; name=&quot;__codelineno-2-6&quot; href=&quot;#__codelineno-2-6&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-7&quot; name=&quot;__codelineno-2-7&quot; href=&quot;#__codelineno-2-7&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;mailSender&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$mailSender&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-8&quot; name=&quot;__codelineno-2-8&quot; href=&quot;#__codelineno-2-8&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-9&quot; name=&quot;__codelineno-2-9&quot; href=&quot;#__codelineno-2-9&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-10&quot; name=&quot;__codelineno-2-10&quot; href=&quot;#__codelineno-2-10&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;sendEmail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;array&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-11&quot; name=&quot;__codelineno-2-11&quot; href=&quot;#__codelineno-2-11&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-12&quot; name=&quot;__codelineno-2-12&quot; href=&quot;#__codelineno-2-12&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;mailSender&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;sendEmail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;dest&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;subject&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;message&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-13&quot; name=&quot;__codelineno-2-13&quot; href=&quot;#__codelineno-2-13&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-14&quot; name=&quot;__codelineno-2-14&quot; href=&quot;#__codelineno-2-14&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This means that you wouldn&apos;t have to change anything there. You simply need to inject the decorator into that controller:&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-3-1&quot; name=&quot;__codelineno-3-1&quot; href=&quot;#__codelineno-3-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;nv&quot;&gt;$decorator&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ErrorLoggerDecorator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MailSenderService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-2&quot; name=&quot;__codelineno-3-2&quot; href=&quot;#__codelineno-3-2&quot;&gt;&lt;/a&gt;&lt;span class=&quot;nv&quot;&gt;$controller&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MailSendingController&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$decorator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you&apos;re using a framework, this might be done via configuration. In fact, Symfony actually has built-in support for &lt;a href=&quot;https://symfony.com/doc/current/service_container/service_decoration.html&quot;&gt;service decoration&lt;/a&gt; in its configuration making it even easier to set up.&lt;/p&gt;
&lt;h3 id=&quot;chaining-decorators&quot;&gt;Chaining decorators&lt;/h3&gt;
&lt;p&gt;Let&apos;s add another decorator: In some parts of my application, I want to retry one more time sending the email if it failed.&lt;/p&gt;
&lt;p&gt;We can add a new decorator for that:&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-4-1&quot; name=&quot;__codelineno-4-1&quot; href=&quot;#__codelineno-4-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;RetryDecorator&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MailSenderInterface&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-2&quot; name=&quot;__codelineno-4-2&quot; href=&quot;#__codelineno-4-2&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-3&quot; name=&quot;__codelineno-4-3&quot; href=&quot;#__codelineno-4-3&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MailSenderInterface&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$decorated&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-4&quot; name=&quot;__codelineno-4-4&quot; href=&quot;#__codelineno-4-4&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-4-5&quot; name=&quot;__codelineno-4-5&quot; href=&quot;#__codelineno-4-5&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;fm&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;MailSenderInterface&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$decorated&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-6&quot; name=&quot;__codelineno-4-6&quot; href=&quot;#__codelineno-4-6&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-7&quot; name=&quot;__codelineno-4-7&quot; href=&quot;#__codelineno-4-7&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;decorated&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$decorated&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-8&quot; name=&quot;__codelineno-4-8&quot; href=&quot;#__codelineno-4-8&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-9&quot; name=&quot;__codelineno-4-9&quot; href=&quot;#__codelineno-4-9&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-4-10&quot; name=&quot;__codelineno-4-10&quot; href=&quot;#__codelineno-4-10&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;sendEmail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$destination&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$subject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;bool&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-11&quot; name=&quot;__codelineno-4-11&quot; href=&quot;#__codelineno-4-11&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-12&quot; name=&quot;__codelineno-4-12&quot; href=&quot;#__codelineno-4-12&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;decorated&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;sendEmail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$destination&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$subject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-13&quot; name=&quot;__codelineno-4-13&quot; href=&quot;#__codelineno-4-13&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-14&quot; name=&quot;__codelineno-4-14&quot; href=&quot;#__codelineno-4-14&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-15&quot; name=&quot;__codelineno-4-15&quot; href=&quot;#__codelineno-4-15&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-4-16&quot; name=&quot;__codelineno-4-16&quot; href=&quot;#__codelineno-4-16&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;decorated&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;sendEmail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$destination&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$subject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-17&quot; name=&quot;__codelineno-4-17&quot; href=&quot;#__codelineno-4-17&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-18&quot; name=&quot;__codelineno-4-18&quot; href=&quot;#__codelineno-4-18&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Simple, isn&apos;t it?&lt;/p&gt;
&lt;p&gt;You can then add this one on top of the other if needed.&lt;/p&gt;
&lt;h2 id=&quot;why-should-i-use-this-instead-of-inheritance&quot;&gt;Why should I use this instead of inheritance?&lt;/h2&gt;
&lt;p&gt;While both cases studied above could have been solved with inheritance, inheritance has some limits and disadvantages that decorators can fix:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;if your service is declared as a &lt;strong&gt;final class&lt;/strong&gt;, you won&apos;t be able to use inheritance. This is often the case with some 3rd party libraries, including some Symfony packages.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can chain your decorators however you like! To use our examples above: Maybe one part of your application wants to log error but try sending only the email once, maybe another one would like to send twice and log the error as well, etc...&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><link>https://blog.detassigny.net/design-pattern-3-decorator-pattern/</link><source url="https://blog.detassigny.net/feed_rss_created.xml">$&gt; blog detassigny.net</source><pubDate>Sat, 03 Apr 2021 13:48:36 +0000</pubDate><guid isPermaLink="true">https://blog.detassigny.net/design-pattern-3-decorator-pattern/</guid></item><item><title>Mocking in PHP #4: Phake</title><author>Gabriel de Tassigny</author><description>&lt;h1 id=&quot;mocking-in-php-4-phake&quot;&gt;Mocking in PHP #4: Phake&lt;/h1&gt;
&lt;p&gt;A simple to use and yet powerful mocking library&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;In previous articles, we&apos;ve seen how it&apos;s possible to write your own mocks, and also how easier it is to use PHPUnit built-in mocking mechanism. We&apos;ve then finally looked at one of the most popular PHP mocking library: Mockery.&lt;/p&gt;
&lt;p&gt;We&apos;ll now look at an alternative one called &lt;a href=&quot;https://github.com/mlively/Phake&quot;&gt;Phake&lt;/a&gt;. We will compare the two and what their pros and cons are.&lt;/p&gt;
&lt;p&gt;Phake is certainly less famous than Mockery, however it has a slightly different approach to mocking in some cases. It&apos;s worth noting that it&apos;s heavily inspired by &lt;a href=&quot;https://site.mockito.org&quot;&gt;Mockito&lt;/a&gt;, a Java mocking library.&lt;/p&gt;
&lt;h2 id=&quot;case-study&quot;&gt;Case study&lt;/h2&gt;
&lt;p&gt;In order to compare these libraries appropriately, let&apos;s reuse our example from the previous articles.&lt;/p&gt;
&lt;p&gt;The following PostService class takes as dependencies a doctrine entity manager and a repository.&lt;/p&gt;
&lt;p&gt;It also has two public methods that we will want to test :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;one to create a post&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;one to retrieve a post from the DB&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-0-1&quot; name=&quot;__codelineno-0-1&quot; href=&quot;#__codelineno-0-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;php&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-2&quot; name=&quot;__codelineno-0-2&quot; href=&quot;#__codelineno-0-2&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-3&quot; name=&quot;__codelineno-0-3&quot; href=&quot;#__codelineno-0-3&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-4&quot; name=&quot;__codelineno-0-4&quot; href=&quot;#__codelineno-0-4&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-5&quot; name=&quot;__codelineno-0-5&quot; href=&quot;#__codelineno-0-5&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Doctrine\ORM\EntityManagerInterface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-6&quot; name=&quot;__codelineno-0-6&quot; href=&quot;#__codelineno-0-6&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-7&quot; name=&quot;__codelineno-0-7&quot; href=&quot;#__codelineno-0-7&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PostService&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-8&quot; name=&quot;__codelineno-0-8&quot; href=&quot;#__codelineno-0-8&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-9&quot; name=&quot;__codelineno-0-9&quot; href=&quot;#__codelineno-0-9&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var EntityManagerInterface */&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-10&quot; name=&quot;__codelineno-0-10&quot; href=&quot;#__codelineno-0-10&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$entityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-11&quot; name=&quot;__codelineno-0-11&quot; href=&quot;#__codelineno-0-11&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-12&quot; name=&quot;__codelineno-0-12&quot; href=&quot;#__codelineno-0-12&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var PostRepository  */&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-13&quot; name=&quot;__codelineno-0-13&quot; href=&quot;#__codelineno-0-13&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-14&quot; name=&quot;__codelineno-0-14&quot; href=&quot;#__codelineno-0-14&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-15&quot; name=&quot;__codelineno-0-15&quot; href=&quot;#__codelineno-0-15&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;fm&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;EntityManagerInterface&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$entityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PostRepository&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-16&quot; name=&quot;__codelineno-0-16&quot; href=&quot;#__codelineno-0-16&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-17&quot; name=&quot;__codelineno-0-17&quot; href=&quot;#__codelineno-0-17&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$entityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-18&quot; name=&quot;__codelineno-0-18&quot; href=&quot;#__codelineno-0-18&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postRepository&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-19&quot; name=&quot;__codelineno-0-19&quot; href=&quot;#__codelineno-0-19&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-20&quot; name=&quot;__codelineno-0-20&quot; href=&quot;#__codelineno-0-20&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-21&quot; name=&quot;__codelineno-0-21&quot; href=&quot;#__codelineno-0-21&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;createPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-22&quot; name=&quot;__codelineno-0-22&quot; href=&quot;#__codelineno-0-22&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-23&quot; name=&quot;__codelineno-0-23&quot; href=&quot;#__codelineno-0-23&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-24&quot; name=&quot;__codelineno-0-24&quot; href=&quot;#__codelineno-0-24&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;flush&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-25&quot; name=&quot;__codelineno-0-25&quot; href=&quot;#__codelineno-0-25&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-26&quot; name=&quot;__codelineno-0-26&quot; href=&quot;#__codelineno-0-26&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-27&quot; name=&quot;__codelineno-0-27&quot; href=&quot;#__codelineno-0-27&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-28&quot; name=&quot;__codelineno-0-28&quot; href=&quot;#__codelineno-0-28&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-29&quot; name=&quot;__codelineno-0-29&quot; href=&quot;#__codelineno-0-29&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;sd&quot;&gt;/** @var Post|null $post */&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-30&quot; name=&quot;__codelineno-0-30&quot; href=&quot;#__codelineno-0-30&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postRepository&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-31&quot; name=&quot;__codelineno-0-31&quot; href=&quot;#__codelineno-0-31&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;is_null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-32&quot; name=&quot;__codelineno-0-32&quot; href=&quot;#__codelineno-0-32&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;\RuntimeException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;Post not found&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-33&quot; name=&quot;__codelineno-0-33&quot; href=&quot;#__codelineno-0-33&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-34&quot; name=&quot;__codelineno-0-34&quot; href=&quot;#__codelineno-0-34&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-35&quot; name=&quot;__codelineno-0-35&quot; href=&quot;#__codelineno-0-35&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-36&quot; name=&quot;__codelineno-0-36&quot; href=&quot;#__codelineno-0-36&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-37&quot; name=&quot;__codelineno-0-37&quot; href=&quot;#__codelineno-0-37&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;installation&quot;&gt;Installation&lt;/h2&gt;
&lt;p&gt;Just like with Mockery, Phake can be installed with composer:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;composer require --dev phake/phake&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now that it&apos;s installed, let&apos;s have a look at unit testing this service class.&lt;/p&gt;
&lt;h2 id=&quot;unit-tests&quot;&gt;Unit tests&lt;/h2&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-1-1&quot; name=&quot;__codelineno-1-1&quot; href=&quot;#__codelineno-1-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;php&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-2&quot; name=&quot;__codelineno-1-2&quot; href=&quot;#__codelineno-1-2&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-3&quot; name=&quot;__codelineno-1-3&quot; href=&quot;#__codelineno-1-3&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\Tests\Phake&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-4&quot; name=&quot;__codelineno-1-4&quot; href=&quot;#__codelineno-1-4&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-5&quot; name=&quot;__codelineno-1-5&quot; href=&quot;#__codelineno-1-5&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-6&quot; name=&quot;__codelineno-1-6&quot; href=&quot;#__codelineno-1-6&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\PostRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-7&quot; name=&quot;__codelineno-1-7&quot; href=&quot;#__codelineno-1-7&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\PostService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-8&quot; name=&quot;__codelineno-1-8&quot; href=&quot;#__codelineno-1-8&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Doctrine\ORM\EntityManagerInterface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-9&quot; name=&quot;__codelineno-1-9&quot; href=&quot;#__codelineno-1-9&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Phake&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-10&quot; name=&quot;__codelineno-1-10&quot; href=&quot;#__codelineno-1-10&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Phake_IMock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-11&quot; name=&quot;__codelineno-1-11&quot; href=&quot;#__codelineno-1-11&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PHPUnit\Framework\TestCase&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-12&quot; name=&quot;__codelineno-1-12&quot; href=&quot;#__codelineno-1-12&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-13&quot; name=&quot;__codelineno-1-13&quot; href=&quot;#__codelineno-1-13&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PostServiceTest&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;TestCase&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-14&quot; name=&quot;__codelineno-1-14&quot; href=&quot;#__codelineno-1-14&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-15&quot; name=&quot;__codelineno-1-15&quot; href=&quot;#__codelineno-1-15&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;POST_ID&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-16&quot; name=&quot;__codelineno-1-16&quot; href=&quot;#__codelineno-1-16&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-17&quot; name=&quot;__codelineno-1-17&quot; href=&quot;#__codelineno-1-17&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var PostRepository|Phake_IMock */&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-18&quot; name=&quot;__codelineno-1-18&quot; href=&quot;#__codelineno-1-18&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-19&quot; name=&quot;__codelineno-1-19&quot; href=&quot;#__codelineno-1-19&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-20&quot; name=&quot;__codelineno-1-20&quot; href=&quot;#__codelineno-1-20&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var EntityManagerInterface|Phake_IMock */&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-21&quot; name=&quot;__codelineno-1-21&quot; href=&quot;#__codelineno-1-21&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$entityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-22&quot; name=&quot;__codelineno-1-22&quot; href=&quot;#__codelineno-1-22&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-23&quot; name=&quot;__codelineno-1-23&quot; href=&quot;#__codelineno-1-23&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var PostService */&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-24&quot; name=&quot;__codelineno-1-24&quot; href=&quot;#__codelineno-1-24&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-25&quot; name=&quot;__codelineno-1-25&quot; href=&quot;#__codelineno-1-25&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-26&quot; name=&quot;__codelineno-1-26&quot; href=&quot;#__codelineno-1-26&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;setUp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-27&quot; name=&quot;__codelineno-1-27&quot; href=&quot;#__codelineno-1-27&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-28&quot; name=&quot;__codelineno-1-28&quot; href=&quot;#__codelineno-1-28&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postRepository&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Phake&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;mock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;PostRepository&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-29&quot; name=&quot;__codelineno-1-29&quot; href=&quot;#__codelineno-1-29&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Phake&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;mock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;EntityManagerInterface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-30&quot; name=&quot;__codelineno-1-30&quot; href=&quot;#__codelineno-1-30&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;service&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PostService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-31&quot; name=&quot;__codelineno-1-31&quot; href=&quot;#__codelineno-1-31&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-32&quot; name=&quot;__codelineno-1-32&quot; href=&quot;#__codelineno-1-32&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-33&quot; name=&quot;__codelineno-1-33&quot; href=&quot;#__codelineno-1-33&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testGetPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-34&quot; name=&quot;__codelineno-1-34&quot; href=&quot;#__codelineno-1-34&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-35&quot; name=&quot;__codelineno-1-35&quot; href=&quot;#__codelineno-1-35&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$expected&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-36&quot; name=&quot;__codelineno-1-36&quot; href=&quot;#__codelineno-1-36&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nx&quot;&gt;Phake&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;when&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;POST_ID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;thenReturn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$expected&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-37&quot; name=&quot;__codelineno-1-37&quot; href=&quot;#__codelineno-1-37&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-38&quot; name=&quot;__codelineno-1-38&quot; href=&quot;#__codelineno-1-38&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$actual&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;POST_ID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-39&quot; name=&quot;__codelineno-1-39&quot; href=&quot;#__codelineno-1-39&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-40&quot; name=&quot;__codelineno-1-40&quot; href=&quot;#__codelineno-1-40&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;assertSame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$expected&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$actual&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-41&quot; name=&quot;__codelineno-1-41&quot; href=&quot;#__codelineno-1-41&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-42&quot; name=&quot;__codelineno-1-42&quot; href=&quot;#__codelineno-1-42&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-43&quot; name=&quot;__codelineno-1-43&quot; href=&quot;#__codelineno-1-43&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testGetPost_PostNotFound&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-44&quot; name=&quot;__codelineno-1-44&quot; href=&quot;#__codelineno-1-44&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-45&quot; name=&quot;__codelineno-1-45&quot; href=&quot;#__codelineno-1-45&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;expectException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;\RuntimeException&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-46&quot; name=&quot;__codelineno-1-46&quot; href=&quot;#__codelineno-1-46&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-47&quot; name=&quot;__codelineno-1-47&quot; href=&quot;#__codelineno-1-47&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;POST_ID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-48&quot; name=&quot;__codelineno-1-48&quot; href=&quot;#__codelineno-1-48&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-49&quot; name=&quot;__codelineno-1-49&quot; href=&quot;#__codelineno-1-49&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-50&quot; name=&quot;__codelineno-1-50&quot; href=&quot;#__codelineno-1-50&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testCreatePost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-51&quot; name=&quot;__codelineno-1-51&quot; href=&quot;#__codelineno-1-51&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-52&quot; name=&quot;__codelineno-1-52&quot; href=&quot;#__codelineno-1-52&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-53&quot; name=&quot;__codelineno-1-53&quot; href=&quot;#__codelineno-1-53&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-54&quot; name=&quot;__codelineno-1-54&quot; href=&quot;#__codelineno-1-54&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;createPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-55&quot; name=&quot;__codelineno-1-55&quot; href=&quot;#__codelineno-1-55&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-56&quot; name=&quot;__codelineno-1-56&quot; href=&quot;#__codelineno-1-56&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nx&quot;&gt;Phake&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;verify&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-57&quot; name=&quot;__codelineno-1-57&quot; href=&quot;#__codelineno-1-57&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nx&quot;&gt;Phake&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;verify&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;flush&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-58&quot; name=&quot;__codelineno-1-58&quot; href=&quot;#__codelineno-1-58&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-59&quot; name=&quot;__codelineno-1-59&quot; href=&quot;#__codelineno-1-59&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can notice a few similarities with Mockery:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;we use a static call to &lt;em&gt;Phake::mock&lt;/em&gt; to instantiate our mocks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;we can define behaviours fairly easily for each mock&apos;s methods.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, there are some differences in the approach and syntax:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Phake doesn&apos;t need to include any PHP trait to be able to make assertions in PHPUnit (compared to Mockery&apos;s &lt;em&gt;MockeryPHPUnitIntegration&lt;/em&gt; trait)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We use &lt;em&gt;Phake::when&lt;/em&gt; to define an expected outcome of a method (return statement, throwing an exception...)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;em&gt;testGetPost_PostNotFound&lt;/em&gt;, we didn&apos;t define any expected outcome. That&apos;s because by default Phake methods will return null, which is what we wanted here.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Phake::verify&lt;/em&gt; is used to assert an excepted call has been made to the mock. This is a fairly big difference compared to Mockery for two reasons:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mockery uses the same call to the &lt;em&gt;expects&lt;/em&gt; method to both define an expected outcome and verify that a call was made.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Phake::verify&lt;/em&gt; is called &lt;strong&gt;after&lt;/strong&gt; the method call takes place, just like a regular PHPUnit assertion. This is in my opinion way more logical.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I personally prefer Phake&apos;s syntax than Mockery&apos;s. It&apos;s more straightforward, the distinction between &lt;em&gt;Phake::when&lt;/em&gt; and &lt;em&gt;Phake::verify&lt;/em&gt; gives a clearer intent, and verifying calls at the end of the test is more instinctive.&lt;/p&gt;
&lt;p&gt;This is however a matter of personal preferences, as both Mockery and Phake present similar functionalities.&lt;/p&gt;
&lt;p&gt;Here is a link to &lt;a href=&quot;https://phake.readthedocs.io/en/latest/index.html&quot; title=&quot;Phake&apos;s documentation&quot;&gt;Phake&apos;s documentation&lt;/a&gt; if you are interested.&lt;/p&gt;</description><link>https://blog.detassigny.net/mocking-in-php-4-phake/</link><source url="https://blog.detassigny.net/feed_rss_created.xml">$&gt; blog detassigny.net</source><pubDate>Thu, 22 Oct 2020 19:56:44 +0000</pubDate><guid isPermaLink="true">https://blog.detassigny.net/mocking-in-php-4-phake/</guid></item><item><title>Mocking in PHP #3: Mockery</title><author>Gabriel de Tassigny</author><description>&lt;h1 id=&quot;mocking-in-php-3-mockery&quot;&gt;Mocking in PHP #3: Mockery&lt;/h1&gt;
&lt;p&gt;How to use one of PHP&apos;s most popular mocking library&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;In previous articles, we&apos;ve seen how it&apos;s possible to write your own mocks, and also how easier it is to use PHPUnit built-in mocking mechanism.&lt;/p&gt;
&lt;p&gt;However, there are a few libraries dedicated to mocking in PHP land. Their popularities prove that while PHPUnit can work, it isn&apos;t always enough and its syntax can be rather confusing at times.&lt;/p&gt;
&lt;p&gt;In this article, we&apos;ll demonstrate how to use &lt;a href=&quot;https://packagist.org/packages/mockery/mockery&quot; title=&quot;mockery&quot;&gt;mockery.&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;case-study&quot;&gt;Case study&lt;/h2&gt;
&lt;p&gt;Let&apos;s reuse our example from the previous article of the PostService class.&lt;/p&gt;
&lt;p&gt;This class takes as dependencies a doctrine entity manager and a repository.&lt;/p&gt;
&lt;p&gt;It also has two public methods that we will want to test :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;one to create a post&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;one to retrieve a post from the DB&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-0-1&quot; name=&quot;__codelineno-0-1&quot; href=&quot;#__codelineno-0-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;php&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-2&quot; name=&quot;__codelineno-0-2&quot; href=&quot;#__codelineno-0-2&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-3&quot; name=&quot;__codelineno-0-3&quot; href=&quot;#__codelineno-0-3&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-4&quot; name=&quot;__codelineno-0-4&quot; href=&quot;#__codelineno-0-4&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-5&quot; name=&quot;__codelineno-0-5&quot; href=&quot;#__codelineno-0-5&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Doctrine\ORM\EntityManagerInterface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-6&quot; name=&quot;__codelineno-0-6&quot; href=&quot;#__codelineno-0-6&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-7&quot; name=&quot;__codelineno-0-7&quot; href=&quot;#__codelineno-0-7&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PostService&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-8&quot; name=&quot;__codelineno-0-8&quot; href=&quot;#__codelineno-0-8&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-9&quot; name=&quot;__codelineno-0-9&quot; href=&quot;#__codelineno-0-9&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var EntityManagerInterface */&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-10&quot; name=&quot;__codelineno-0-10&quot; href=&quot;#__codelineno-0-10&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$entityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-11&quot; name=&quot;__codelineno-0-11&quot; href=&quot;#__codelineno-0-11&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-12&quot; name=&quot;__codelineno-0-12&quot; href=&quot;#__codelineno-0-12&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var PostRepository  */&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-13&quot; name=&quot;__codelineno-0-13&quot; href=&quot;#__codelineno-0-13&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-14&quot; name=&quot;__codelineno-0-14&quot; href=&quot;#__codelineno-0-14&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-15&quot; name=&quot;__codelineno-0-15&quot; href=&quot;#__codelineno-0-15&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;fm&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;EntityManagerInterface&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$entityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PostRepository&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-16&quot; name=&quot;__codelineno-0-16&quot; href=&quot;#__codelineno-0-16&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-17&quot; name=&quot;__codelineno-0-17&quot; href=&quot;#__codelineno-0-17&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$entityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-18&quot; name=&quot;__codelineno-0-18&quot; href=&quot;#__codelineno-0-18&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postRepository&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-19&quot; name=&quot;__codelineno-0-19&quot; href=&quot;#__codelineno-0-19&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-20&quot; name=&quot;__codelineno-0-20&quot; href=&quot;#__codelineno-0-20&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-21&quot; name=&quot;__codelineno-0-21&quot; href=&quot;#__codelineno-0-21&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;createPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-22&quot; name=&quot;__codelineno-0-22&quot; href=&quot;#__codelineno-0-22&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-23&quot; name=&quot;__codelineno-0-23&quot; href=&quot;#__codelineno-0-23&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-24&quot; name=&quot;__codelineno-0-24&quot; href=&quot;#__codelineno-0-24&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;flush&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-25&quot; name=&quot;__codelineno-0-25&quot; href=&quot;#__codelineno-0-25&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-26&quot; name=&quot;__codelineno-0-26&quot; href=&quot;#__codelineno-0-26&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-27&quot; name=&quot;__codelineno-0-27&quot; href=&quot;#__codelineno-0-27&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-28&quot; name=&quot;__codelineno-0-28&quot; href=&quot;#__codelineno-0-28&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-29&quot; name=&quot;__codelineno-0-29&quot; href=&quot;#__codelineno-0-29&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;sd&quot;&gt;/** @var Post|null $post */&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-30&quot; name=&quot;__codelineno-0-30&quot; href=&quot;#__codelineno-0-30&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postRepository&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-31&quot; name=&quot;__codelineno-0-31&quot; href=&quot;#__codelineno-0-31&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;is_null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-32&quot; name=&quot;__codelineno-0-32&quot; href=&quot;#__codelineno-0-32&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;\RuntimeException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;Post not found&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-33&quot; name=&quot;__codelineno-0-33&quot; href=&quot;#__codelineno-0-33&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-34&quot; name=&quot;__codelineno-0-34&quot; href=&quot;#__codelineno-0-34&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-35&quot; name=&quot;__codelineno-0-35&quot; href=&quot;#__codelineno-0-35&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-36&quot; name=&quot;__codelineno-0-36&quot; href=&quot;#__codelineno-0-36&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-37&quot; name=&quot;__codelineno-0-37&quot; href=&quot;#__codelineno-0-37&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;installation&quot;&gt;Installation&lt;/h2&gt;
&lt;p&gt;First, if you haven&apos;t already done so, you will need to install mockery using composer:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;composer require --dev mockery/mockery&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;unit-tests&quot;&gt;Unit tests&lt;/h2&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-1-1&quot; name=&quot;__codelineno-1-1&quot; href=&quot;#__codelineno-1-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;php&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-2&quot; name=&quot;__codelineno-1-2&quot; href=&quot;#__codelineno-1-2&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-3&quot; name=&quot;__codelineno-1-3&quot; href=&quot;#__codelineno-1-3&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\Tests\Mockery&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-4&quot; name=&quot;__codelineno-1-4&quot; href=&quot;#__codelineno-1-4&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-5&quot; name=&quot;__codelineno-1-5&quot; href=&quot;#__codelineno-1-5&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-6&quot; name=&quot;__codelineno-1-6&quot; href=&quot;#__codelineno-1-6&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\PostRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-7&quot; name=&quot;__codelineno-1-7&quot; href=&quot;#__codelineno-1-7&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\PostService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-8&quot; name=&quot;__codelineno-1-8&quot; href=&quot;#__codelineno-1-8&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Doctrine\ORM\EntityManagerInterface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-9&quot; name=&quot;__codelineno-1-9&quot; href=&quot;#__codelineno-1-9&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Mockery&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-10&quot; name=&quot;__codelineno-1-10&quot; href=&quot;#__codelineno-1-10&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-11&quot; name=&quot;__codelineno-1-11&quot; href=&quot;#__codelineno-1-11&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Mockery\MockInterface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-12&quot; name=&quot;__codelineno-1-12&quot; href=&quot;#__codelineno-1-12&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PHPUnit\Framework\TestCase&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-13&quot; name=&quot;__codelineno-1-13&quot; href=&quot;#__codelineno-1-13&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-14&quot; name=&quot;__codelineno-1-14&quot; href=&quot;#__codelineno-1-14&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PostServiceTest&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;TestCase&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-15&quot; name=&quot;__codelineno-1-15&quot; href=&quot;#__codelineno-1-15&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-16&quot; name=&quot;__codelineno-1-16&quot; href=&quot;#__codelineno-1-16&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MockeryPHPUnitIntegration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-17&quot; name=&quot;__codelineno-1-17&quot; href=&quot;#__codelineno-1-17&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-18&quot; name=&quot;__codelineno-1-18&quot; href=&quot;#__codelineno-1-18&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;POST_ID&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-19&quot; name=&quot;__codelineno-1-19&quot; href=&quot;#__codelineno-1-19&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-20&quot; name=&quot;__codelineno-1-20&quot; href=&quot;#__codelineno-1-20&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var PostRepository|MockInterface */&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-21&quot; name=&quot;__codelineno-1-21&quot; href=&quot;#__codelineno-1-21&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-22&quot; name=&quot;__codelineno-1-22&quot; href=&quot;#__codelineno-1-22&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-23&quot; name=&quot;__codelineno-1-23&quot; href=&quot;#__codelineno-1-23&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var EntityManagerInterface|MockInterface */&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-24&quot; name=&quot;__codelineno-1-24&quot; href=&quot;#__codelineno-1-24&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$entityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-25&quot; name=&quot;__codelineno-1-25&quot; href=&quot;#__codelineno-1-25&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-26&quot; name=&quot;__codelineno-1-26&quot; href=&quot;#__codelineno-1-26&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var PostService */&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-27&quot; name=&quot;__codelineno-1-27&quot; href=&quot;#__codelineno-1-27&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-28&quot; name=&quot;__codelineno-1-28&quot; href=&quot;#__codelineno-1-28&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-29&quot; name=&quot;__codelineno-1-29&quot; href=&quot;#__codelineno-1-29&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;setUp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-30&quot; name=&quot;__codelineno-1-30&quot; href=&quot;#__codelineno-1-30&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-31&quot; name=&quot;__codelineno-1-31&quot; href=&quot;#__codelineno-1-31&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postRepository&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Mockery&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;mock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;PostRepository&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-32&quot; name=&quot;__codelineno-1-32&quot; href=&quot;#__codelineno-1-32&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Mockery&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;mock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;EntityManagerInterface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-33&quot; name=&quot;__codelineno-1-33&quot; href=&quot;#__codelineno-1-33&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;service&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PostService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-34&quot; name=&quot;__codelineno-1-34&quot; href=&quot;#__codelineno-1-34&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-35&quot; name=&quot;__codelineno-1-35&quot; href=&quot;#__codelineno-1-35&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-36&quot; name=&quot;__codelineno-1-36&quot; href=&quot;#__codelineno-1-36&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testGetPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-37&quot; name=&quot;__codelineno-1-37&quot; href=&quot;#__codelineno-1-37&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-38&quot; name=&quot;__codelineno-1-38&quot; href=&quot;#__codelineno-1-38&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$expected&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-39&quot; name=&quot;__codelineno-1-39&quot; href=&quot;#__codelineno-1-39&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-40&quot; name=&quot;__codelineno-1-40&quot; href=&quot;#__codelineno-1-40&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postRepository&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;expects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;find&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-41&quot; name=&quot;__codelineno-1-41&quot; href=&quot;#__codelineno-1-41&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;POST_ID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-42&quot; name=&quot;__codelineno-1-42&quot; href=&quot;#__codelineno-1-42&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;andReturn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$expected&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-43&quot; name=&quot;__codelineno-1-43&quot; href=&quot;#__codelineno-1-43&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-44&quot; name=&quot;__codelineno-1-44&quot; href=&quot;#__codelineno-1-44&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$actual&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;POST_ID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-45&quot; name=&quot;__codelineno-1-45&quot; href=&quot;#__codelineno-1-45&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-46&quot; name=&quot;__codelineno-1-46&quot; href=&quot;#__codelineno-1-46&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;assertSame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$expected&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$actual&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-47&quot; name=&quot;__codelineno-1-47&quot; href=&quot;#__codelineno-1-47&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-48&quot; name=&quot;__codelineno-1-48&quot; href=&quot;#__codelineno-1-48&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-49&quot; name=&quot;__codelineno-1-49&quot; href=&quot;#__codelineno-1-49&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testGetPost_PostNotFound&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-50&quot; name=&quot;__codelineno-1-50&quot; href=&quot;#__codelineno-1-50&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-51&quot; name=&quot;__codelineno-1-51&quot; href=&quot;#__codelineno-1-51&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;expectException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;\RuntimeException&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-52&quot; name=&quot;__codelineno-1-52&quot; href=&quot;#__codelineno-1-52&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-53&quot; name=&quot;__codelineno-1-53&quot; href=&quot;#__codelineno-1-53&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postRepository&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;expects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;find&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-54&quot; name=&quot;__codelineno-1-54&quot; href=&quot;#__codelineno-1-54&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;POST_ID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-55&quot; name=&quot;__codelineno-1-55&quot; href=&quot;#__codelineno-1-55&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;andReturn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-56&quot; name=&quot;__codelineno-1-56&quot; href=&quot;#__codelineno-1-56&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-57&quot; name=&quot;__codelineno-1-57&quot; href=&quot;#__codelineno-1-57&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;POST_ID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-58&quot; name=&quot;__codelineno-1-58&quot; href=&quot;#__codelineno-1-58&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-59&quot; name=&quot;__codelineno-1-59&quot; href=&quot;#__codelineno-1-59&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-60&quot; name=&quot;__codelineno-1-60&quot; href=&quot;#__codelineno-1-60&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testCreatePost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-61&quot; name=&quot;__codelineno-1-61&quot; href=&quot;#__codelineno-1-61&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-62&quot; name=&quot;__codelineno-1-62&quot; href=&quot;#__codelineno-1-62&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-63&quot; name=&quot;__codelineno-1-63&quot; href=&quot;#__codelineno-1-63&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-64&quot; name=&quot;__codelineno-1-64&quot; href=&quot;#__codelineno-1-64&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;expects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;persist&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-65&quot; name=&quot;__codelineno-1-65&quot; href=&quot;#__codelineno-1-65&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;expects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;flush&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-66&quot; name=&quot;__codelineno-1-66&quot; href=&quot;#__codelineno-1-66&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-67&quot; name=&quot;__codelineno-1-67&quot; href=&quot;#__codelineno-1-67&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;createPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-68&quot; name=&quot;__codelineno-1-68&quot; href=&quot;#__codelineno-1-68&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-69&quot; name=&quot;__codelineno-1-69&quot; href=&quot;#__codelineno-1-69&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Compared to PHPUnit mocks, we can note a few things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We use the static call to &lt;em&gt;Mockery::mock&lt;/em&gt; to create a mock of the class passed as an argument.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We use a trait named &lt;em&gt;MockeryPHPUnitIntegration&lt;/em&gt; to tell PHPUnit to treat all Mockery&apos;s &lt;em&gt;expects&lt;/em&gt; calls as assertions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;em&gt;testGetPost_PostNotFound&lt;/em&gt;, we need to tell Mockery that the call to &lt;em&gt;find&lt;/em&gt; should return null. If not, an error will be thrown by Mockery.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;other-functionalities&quot;&gt;Other functionalities&lt;/h2&gt;
&lt;p&gt;Mockery supports many useful additional features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Spies&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Partial mocks&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;allows&lt;/em&gt; method let you define a desired outcome for a method call without requiring it to be called (compared to &lt;em&gt;expects&lt;/em&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;...and many more! Have a look at &lt;a href=&quot;http://docs.mockery.io/en/latest/index.html&quot; title=&quot;Mockery&apos;s documentation&quot;&gt;their documentation&lt;/a&gt; if you are interested.&lt;/p&gt;</description><link>https://blog.detassigny.net/mocking-in-php-3-mockery/</link><source url="https://blog.detassigny.net/feed_rss_created.xml">$&gt; blog detassigny.net</source><pubDate>Wed, 14 Oct 2020 19:19:55 +0000</pubDate><guid isPermaLink="true">https://blog.detassigny.net/mocking-in-php-3-mockery/</guid></item><item><title>Mocking in PHP #2: PHPUnit mocks</title><author>Gabriel de Tassigny</author><description>&lt;h1 id=&quot;mocking-in-php-2-phpunit-mocks&quot;&gt;Mocking in PHP #2: PHPUnit mocks&lt;/h1&gt;
&lt;p&gt;How to use PHPUnit built-in mocking system&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;As we&apos;ve seen in the &lt;a href=&quot;../mocking-in-php-1-writing-your-own-mocks/&quot; title=&quot;Mocking in PHP #1: Writing your own mocks&quot;&gt;previous article&lt;/a&gt;, writing your own mocks is certainly a good way to understand how mocking works and why it&apos;s a powerful tool in the context of unit tests. However, writing custom mocks takes time and can generate a lot of code once your code base starts to grow.&lt;/p&gt;
&lt;p&gt;Most developers use mocking tools or frameworks to avoid this issue.&lt;/p&gt;
&lt;p&gt;PHPUnit comes with some mocking mechanism, so this can be a good place to start!&lt;/p&gt;
&lt;h2 id=&quot;case-study&quot;&gt;Case study&lt;/h2&gt;
&lt;p&gt;Let&apos;s reuse our example from the previous article of the PostService class.&lt;/p&gt;
&lt;p&gt;This class takes as dependencies a doctrine entity manager and a repository.&lt;/p&gt;
&lt;p&gt;It also has two public methods that we will want to test :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;one to create a post&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;one to retrieve a post from the DB&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-0-1&quot; name=&quot;__codelineno-0-1&quot; href=&quot;#__codelineno-0-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;php&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-2&quot; name=&quot;__codelineno-0-2&quot; href=&quot;#__codelineno-0-2&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-3&quot; name=&quot;__codelineno-0-3&quot; href=&quot;#__codelineno-0-3&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-4&quot; name=&quot;__codelineno-0-4&quot; href=&quot;#__codelineno-0-4&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-5&quot; name=&quot;__codelineno-0-5&quot; href=&quot;#__codelineno-0-5&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Doctrine\ORM\EntityManagerInterface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-6&quot; name=&quot;__codelineno-0-6&quot; href=&quot;#__codelineno-0-6&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-7&quot; name=&quot;__codelineno-0-7&quot; href=&quot;#__codelineno-0-7&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PostService&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-8&quot; name=&quot;__codelineno-0-8&quot; href=&quot;#__codelineno-0-8&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-9&quot; name=&quot;__codelineno-0-9&quot; href=&quot;#__codelineno-0-9&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var EntityManagerInterface */&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-10&quot; name=&quot;__codelineno-0-10&quot; href=&quot;#__codelineno-0-10&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$entityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-11&quot; name=&quot;__codelineno-0-11&quot; href=&quot;#__codelineno-0-11&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-12&quot; name=&quot;__codelineno-0-12&quot; href=&quot;#__codelineno-0-12&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var PostRepository  */&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-13&quot; name=&quot;__codelineno-0-13&quot; href=&quot;#__codelineno-0-13&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-14&quot; name=&quot;__codelineno-0-14&quot; href=&quot;#__codelineno-0-14&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-15&quot; name=&quot;__codelineno-0-15&quot; href=&quot;#__codelineno-0-15&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;fm&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;EntityManagerInterface&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$entityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PostRepository&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-16&quot; name=&quot;__codelineno-0-16&quot; href=&quot;#__codelineno-0-16&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-17&quot; name=&quot;__codelineno-0-17&quot; href=&quot;#__codelineno-0-17&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$entityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-18&quot; name=&quot;__codelineno-0-18&quot; href=&quot;#__codelineno-0-18&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postRepository&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-19&quot; name=&quot;__codelineno-0-19&quot; href=&quot;#__codelineno-0-19&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-20&quot; name=&quot;__codelineno-0-20&quot; href=&quot;#__codelineno-0-20&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-21&quot; name=&quot;__codelineno-0-21&quot; href=&quot;#__codelineno-0-21&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;createPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-22&quot; name=&quot;__codelineno-0-22&quot; href=&quot;#__codelineno-0-22&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-23&quot; name=&quot;__codelineno-0-23&quot; href=&quot;#__codelineno-0-23&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-24&quot; name=&quot;__codelineno-0-24&quot; href=&quot;#__codelineno-0-24&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;flush&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-25&quot; name=&quot;__codelineno-0-25&quot; href=&quot;#__codelineno-0-25&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-26&quot; name=&quot;__codelineno-0-26&quot; href=&quot;#__codelineno-0-26&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-27&quot; name=&quot;__codelineno-0-27&quot; href=&quot;#__codelineno-0-27&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-28&quot; name=&quot;__codelineno-0-28&quot; href=&quot;#__codelineno-0-28&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-29&quot; name=&quot;__codelineno-0-29&quot; href=&quot;#__codelineno-0-29&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;sd&quot;&gt;/** @var Post|null $post */&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-30&quot; name=&quot;__codelineno-0-30&quot; href=&quot;#__codelineno-0-30&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postRepository&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-31&quot; name=&quot;__codelineno-0-31&quot; href=&quot;#__codelineno-0-31&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;is_null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-32&quot; name=&quot;__codelineno-0-32&quot; href=&quot;#__codelineno-0-32&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;\RuntimeException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;Post not found&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-33&quot; name=&quot;__codelineno-0-33&quot; href=&quot;#__codelineno-0-33&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-34&quot; name=&quot;__codelineno-0-34&quot; href=&quot;#__codelineno-0-34&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-35&quot; name=&quot;__codelineno-0-35&quot; href=&quot;#__codelineno-0-35&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-36&quot; name=&quot;__codelineno-0-36&quot; href=&quot;#__codelineno-0-36&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-37&quot; name=&quot;__codelineno-0-37&quot; href=&quot;#__codelineno-0-37&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;unit-tests&quot;&gt;Unit tests&lt;/h2&gt;
&lt;p&gt;This time, we will use the &lt;strong&gt;createMock&lt;/strong&gt; method from PHPUnit to create our mocks.&lt;/p&gt;
&lt;p&gt;This method takes the name of the class as an argument, and returns a mock version of that class.&lt;/p&gt;
&lt;p&gt;Most mocking frameworks (including PHPUnit) works in a similar way that what we did when we created our own mocks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;the mock extends our original class&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;public methods are not doing anything by default (they usually simply returns null)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;we can override the behaviour we want for each public method&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-1-1&quot; name=&quot;__codelineno-1-1&quot; href=&quot;#__codelineno-1-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;php&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-2&quot; name=&quot;__codelineno-1-2&quot; href=&quot;#__codelineno-1-2&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-3&quot; name=&quot;__codelineno-1-3&quot; href=&quot;#__codelineno-1-3&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\Tests\PHPUnit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-4&quot; name=&quot;__codelineno-1-4&quot; href=&quot;#__codelineno-1-4&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-5&quot; name=&quot;__codelineno-1-5&quot; href=&quot;#__codelineno-1-5&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-6&quot; name=&quot;__codelineno-1-6&quot; href=&quot;#__codelineno-1-6&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\PostRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-7&quot; name=&quot;__codelineno-1-7&quot; href=&quot;#__codelineno-1-7&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\PostService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-8&quot; name=&quot;__codelineno-1-8&quot; href=&quot;#__codelineno-1-8&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Doctrine\ORM\EntityManagerInterface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-9&quot; name=&quot;__codelineno-1-9&quot; href=&quot;#__codelineno-1-9&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PHPUnit\Framework\MockObject\MockObject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-10&quot; name=&quot;__codelineno-1-10&quot; href=&quot;#__codelineno-1-10&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PHPUnit\Framework\TestCase&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-11&quot; name=&quot;__codelineno-1-11&quot; href=&quot;#__codelineno-1-11&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-12&quot; name=&quot;__codelineno-1-12&quot; href=&quot;#__codelineno-1-12&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PostServiceTest&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;TestCase&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-13&quot; name=&quot;__codelineno-1-13&quot; href=&quot;#__codelineno-1-13&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-14&quot; name=&quot;__codelineno-1-14&quot; href=&quot;#__codelineno-1-14&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;POST_ID&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-15&quot; name=&quot;__codelineno-1-15&quot; href=&quot;#__codelineno-1-15&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-16&quot; name=&quot;__codelineno-1-16&quot; href=&quot;#__codelineno-1-16&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var PostRepository|MockObject */&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-17&quot; name=&quot;__codelineno-1-17&quot; href=&quot;#__codelineno-1-17&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-18&quot; name=&quot;__codelineno-1-18&quot; href=&quot;#__codelineno-1-18&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-19&quot; name=&quot;__codelineno-1-19&quot; href=&quot;#__codelineno-1-19&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var EntityManagerInterface|MockObject */&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-20&quot; name=&quot;__codelineno-1-20&quot; href=&quot;#__codelineno-1-20&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$entityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-21&quot; name=&quot;__codelineno-1-21&quot; href=&quot;#__codelineno-1-21&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-22&quot; name=&quot;__codelineno-1-22&quot; href=&quot;#__codelineno-1-22&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var PostService */&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-23&quot; name=&quot;__codelineno-1-23&quot; href=&quot;#__codelineno-1-23&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-24&quot; name=&quot;__codelineno-1-24&quot; href=&quot;#__codelineno-1-24&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-25&quot; name=&quot;__codelineno-1-25&quot; href=&quot;#__codelineno-1-25&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;setUp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-26&quot; name=&quot;__codelineno-1-26&quot; href=&quot;#__codelineno-1-26&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-27&quot; name=&quot;__codelineno-1-27&quot; href=&quot;#__codelineno-1-27&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postRepository&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;createMock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;PostRepository&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-28&quot; name=&quot;__codelineno-1-28&quot; href=&quot;#__codelineno-1-28&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;createMock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;EntityManagerInterface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-29&quot; name=&quot;__codelineno-1-29&quot; href=&quot;#__codelineno-1-29&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;service&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PostService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-30&quot; name=&quot;__codelineno-1-30&quot; href=&quot;#__codelineno-1-30&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-31&quot; name=&quot;__codelineno-1-31&quot; href=&quot;#__codelineno-1-31&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-32&quot; name=&quot;__codelineno-1-32&quot; href=&quot;#__codelineno-1-32&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testGetPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-33&quot; name=&quot;__codelineno-1-33&quot; href=&quot;#__codelineno-1-33&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-34&quot; name=&quot;__codelineno-1-34&quot; href=&quot;#__codelineno-1-34&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$expected&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-35&quot; name=&quot;__codelineno-1-35&quot; href=&quot;#__codelineno-1-35&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-36&quot; name=&quot;__codelineno-1-36&quot; href=&quot;#__codelineno-1-36&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postRepository&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;find&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-37&quot; name=&quot;__codelineno-1-37&quot; href=&quot;#__codelineno-1-37&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;POST_ID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-38&quot; name=&quot;__codelineno-1-38&quot; href=&quot;#__codelineno-1-38&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;willReturn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$expected&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-39&quot; name=&quot;__codelineno-1-39&quot; href=&quot;#__codelineno-1-39&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-40&quot; name=&quot;__codelineno-1-40&quot; href=&quot;#__codelineno-1-40&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;POST_ID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-41&quot; name=&quot;__codelineno-1-41&quot; href=&quot;#__codelineno-1-41&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-42&quot; name=&quot;__codelineno-1-42&quot; href=&quot;#__codelineno-1-42&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;assertSame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$expected&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-43&quot; name=&quot;__codelineno-1-43&quot; href=&quot;#__codelineno-1-43&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-44&quot; name=&quot;__codelineno-1-44&quot; href=&quot;#__codelineno-1-44&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-45&quot; name=&quot;__codelineno-1-45&quot; href=&quot;#__codelineno-1-45&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testGetPost_PostNotFound&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-46&quot; name=&quot;__codelineno-1-46&quot; href=&quot;#__codelineno-1-46&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-47&quot; name=&quot;__codelineno-1-47&quot; href=&quot;#__codelineno-1-47&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;expectException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;\RuntimeException&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-48&quot; name=&quot;__codelineno-1-48&quot; href=&quot;#__codelineno-1-48&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-49&quot; name=&quot;__codelineno-1-49&quot; href=&quot;#__codelineno-1-49&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postRepository&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;find&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-50&quot; name=&quot;__codelineno-1-50&quot; href=&quot;#__codelineno-1-50&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;POST_ID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-51&quot; name=&quot;__codelineno-1-51&quot; href=&quot;#__codelineno-1-51&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;willReturn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-52&quot; name=&quot;__codelineno-1-52&quot; href=&quot;#__codelineno-1-52&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-53&quot; name=&quot;__codelineno-1-53&quot; href=&quot;#__codelineno-1-53&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;POST_ID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-54&quot; name=&quot;__codelineno-1-54&quot; href=&quot;#__codelineno-1-54&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-55&quot; name=&quot;__codelineno-1-55&quot; href=&quot;#__codelineno-1-55&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-56&quot; name=&quot;__codelineno-1-56&quot; href=&quot;#__codelineno-1-56&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testCreatePost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-57&quot; name=&quot;__codelineno-1-57&quot; href=&quot;#__codelineno-1-57&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-58&quot; name=&quot;__codelineno-1-58&quot; href=&quot;#__codelineno-1-58&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-59&quot; name=&quot;__codelineno-1-59&quot; href=&quot;#__codelineno-1-59&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-60&quot; name=&quot;__codelineno-1-60&quot; href=&quot;#__codelineno-1-60&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;expects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;once&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-61&quot; name=&quot;__codelineno-1-61&quot; href=&quot;#__codelineno-1-61&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;persist&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-62&quot; name=&quot;__codelineno-1-62&quot; href=&quot;#__codelineno-1-62&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-63&quot; name=&quot;__codelineno-1-63&quot; href=&quot;#__codelineno-1-63&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-64&quot; name=&quot;__codelineno-1-64&quot; href=&quot;#__codelineno-1-64&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;expects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;once&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-65&quot; name=&quot;__codelineno-1-65&quot; href=&quot;#__codelineno-1-65&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;flush&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-66&quot; name=&quot;__codelineno-1-66&quot; href=&quot;#__codelineno-1-66&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-67&quot; name=&quot;__codelineno-1-67&quot; href=&quot;#__codelineno-1-67&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;createPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-68&quot; name=&quot;__codelineno-1-68&quot; href=&quot;#__codelineno-1-68&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-69&quot; name=&quot;__codelineno-1-69&quot; href=&quot;#__codelineno-1-69&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When testing &lt;strong&gt;getPost&lt;/strong&gt;, we mock the behaviour of postRepository using &lt;em&gt;-&amp;gt;method(...)-&amp;gt;with(...)-&amp;gt;willReturn(...).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It means we can define what each method should return for a given set of parameters.&lt;/p&gt;
&lt;p&gt;Furthermore, when testing &lt;strong&gt;createPost&lt;/strong&gt;, we prefix the method mocking by a call to &lt;em&gt;-&amp;gt;expects($this-&amp;gt;once())&lt;/em&gt;. This will perform an assertion that the call has been made once.&lt;/p&gt;
&lt;p&gt;There are of course more options on what you can assert and mock (e.g. you can make a method throw an exception, you can verify successive calls to a method...). &lt;a href=&quot;https://phpunit.de/manual/6.5/en/test-doubles.html#test-doubles.mock-objects&quot; title=&quot;PHPUnit documentation on mock&quot;&gt;PHPUnit documentation on mock&lt;/a&gt; is full of information on all the possibilities.&lt;/p&gt;</description><link>https://blog.detassigny.net/mocking-in-php-2-phpunit-mocks/</link><source url="https://blog.detassigny.net/feed_rss_created.xml">$&gt; blog detassigny.net</source><pubDate>Tue, 07 May 2019 20:37:59 +0000</pubDate><guid isPermaLink="true">https://blog.detassigny.net/mocking-in-php-2-phpunit-mocks/</guid></item><item><title>Mocking in PHP #1: Writing your own mocks</title><author>Gabriel de Tassigny</author><description>&lt;h1 id=&quot;mocking-in-php-1-writing-your-own-mocks&quot;&gt;Mocking in PHP #1: Writing your own mocks&lt;/h1&gt;
&lt;p&gt;A good way to vizualize how mocking works in the first place is to implement your own mocks&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;Mocking is a fundamental part of unit testing. Without mocks, you&apos;re stuck into writing tests that need to handle all dependencies of your class. Which sometimes means having to interact with the database, a file system, an API... It&apos;s simply way to complicated and is outside the scope of unit testing anyway.&lt;/p&gt;
&lt;p&gt;In this series of articles called &quot;Mocking in PHP&quot;, I will explore different ways of mocking your dependencies when writing PHPUnit test.&lt;/p&gt;
&lt;p&gt;While definitely not the most common way of doing this, writing your own mocks can be a great way to understand what a mock is and what it does.&lt;/p&gt;
&lt;p&gt;On the following articles, I will then go through different methods, such as :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PHPUnit mocks&lt;/strong&gt;: Their syntax isn&apos;t very straightforward but they come out of the box with PHPUnit without a need for any other package.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mockery&lt;/strong&gt;: This is probably the most popular PHP mocking library right now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Phake&lt;/strong&gt;: Another mocking library. My personal favourite.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;case-study&quot;&gt;Case Study&lt;/h2&gt;
&lt;p&gt;First, let&apos;s define what we&apos;ll be testing here.&lt;/p&gt;
&lt;p&gt;Let&apos;s say we have a service that is used by our application to interact with blog posts:&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-0-1&quot; name=&quot;__codelineno-0-1&quot; href=&quot;#__codelineno-0-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-2&quot; name=&quot;__codelineno-0-2&quot; href=&quot;#__codelineno-0-2&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-3&quot; name=&quot;__codelineno-0-3&quot; href=&quot;#__codelineno-0-3&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Doctrine\ORM\EntityManagerInterface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-4&quot; name=&quot;__codelineno-0-4&quot; href=&quot;#__codelineno-0-4&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-5&quot; name=&quot;__codelineno-0-5&quot; href=&quot;#__codelineno-0-5&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PostService&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-6&quot; name=&quot;__codelineno-0-6&quot; href=&quot;#__codelineno-0-6&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-7&quot; name=&quot;__codelineno-0-7&quot; href=&quot;#__codelineno-0-7&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var EntityManagerInterface */&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-8&quot; name=&quot;__codelineno-0-8&quot; href=&quot;#__codelineno-0-8&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$entityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-9&quot; name=&quot;__codelineno-0-9&quot; href=&quot;#__codelineno-0-9&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-10&quot; name=&quot;__codelineno-0-10&quot; href=&quot;#__codelineno-0-10&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var PostRepository  */&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-11&quot; name=&quot;__codelineno-0-11&quot; href=&quot;#__codelineno-0-11&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-12&quot; name=&quot;__codelineno-0-12&quot; href=&quot;#__codelineno-0-12&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-13&quot; name=&quot;__codelineno-0-13&quot; href=&quot;#__codelineno-0-13&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;fm&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;EntityManagerInterface&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$entityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PostRepository&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-14&quot; name=&quot;__codelineno-0-14&quot; href=&quot;#__codelineno-0-14&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-15&quot; name=&quot;__codelineno-0-15&quot; href=&quot;#__codelineno-0-15&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$entityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-16&quot; name=&quot;__codelineno-0-16&quot; href=&quot;#__codelineno-0-16&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postRepository&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-17&quot; name=&quot;__codelineno-0-17&quot; href=&quot;#__codelineno-0-17&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-18&quot; name=&quot;__codelineno-0-18&quot; href=&quot;#__codelineno-0-18&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-19&quot; name=&quot;__codelineno-0-19&quot; href=&quot;#__codelineno-0-19&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;createPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-20&quot; name=&quot;__codelineno-0-20&quot; href=&quot;#__codelineno-0-20&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-21&quot; name=&quot;__codelineno-0-21&quot; href=&quot;#__codelineno-0-21&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-22&quot; name=&quot;__codelineno-0-22&quot; href=&quot;#__codelineno-0-22&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;flush&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-23&quot; name=&quot;__codelineno-0-23&quot; href=&quot;#__codelineno-0-23&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-24&quot; name=&quot;__codelineno-0-24&quot; href=&quot;#__codelineno-0-24&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-25&quot; name=&quot;__codelineno-0-25&quot; href=&quot;#__codelineno-0-25&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-26&quot; name=&quot;__codelineno-0-26&quot; href=&quot;#__codelineno-0-26&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-27&quot; name=&quot;__codelineno-0-27&quot; href=&quot;#__codelineno-0-27&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;sd&quot;&gt;/** @var Post|null $post */&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-28&quot; name=&quot;__codelineno-0-28&quot; href=&quot;#__codelineno-0-28&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postRepository&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-29&quot; name=&quot;__codelineno-0-29&quot; href=&quot;#__codelineno-0-29&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;is_null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-30&quot; name=&quot;__codelineno-0-30&quot; href=&quot;#__codelineno-0-30&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;\RuntimeException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;Post not found&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-31&quot; name=&quot;__codelineno-0-31&quot; href=&quot;#__codelineno-0-31&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-32&quot; name=&quot;__codelineno-0-32&quot; href=&quot;#__codelineno-0-32&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-33&quot; name=&quot;__codelineno-0-33&quot; href=&quot;#__codelineno-0-33&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-34&quot; name=&quot;__codelineno-0-34&quot; href=&quot;#__codelineno-0-34&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-35&quot; name=&quot;__codelineno-0-35&quot; href=&quot;#__codelineno-0-35&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It contains two methods :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;one to create a Post entity&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;one to retrieve a Post by a given ID&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Our service also has two &lt;a href=&quot;../design-pattern-2-dependency-injection/&quot; title=&quot;Design pattern: dependency injection&quot;&gt;Injected dependencies&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.doctrine-project.org/&quot; title=&quot;Doctrine&quot;&gt;Doctrine&lt;/a&gt;&apos;s entity manager. We need it for persisting our entities into the database.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Our PostRepository, which is also a doctrine repository. We use that to search for entities.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;unit-tests&quot;&gt;Unit tests&lt;/h2&gt;
&lt;p&gt;In order to test our PostService class, we will need three different classes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;one mock class for the repository&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;one mock class for the entity manager&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;our test suite&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;mocking-the-repository&quot;&gt;Mocking the repository&lt;/h3&gt;
&lt;p&gt;When writing our mock for the repository, we simply need to deal with the methods that our service will interact with, and see what possible outcome we want from our mock.&lt;/p&gt;
&lt;p&gt;In this case, the service only uses one method from the repository : &lt;em&gt;find&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Then, we have two different expected behavior we want to handle :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;an entity is returned&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;null is returned&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-1-1&quot; name=&quot;__codelineno-1-1&quot; href=&quot;#__codelineno-1-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\Tests\OwnMocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-2&quot; name=&quot;__codelineno-1-2&quot; href=&quot;#__codelineno-1-2&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-3&quot; name=&quot;__codelineno-1-3&quot; href=&quot;#__codelineno-1-3&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-4&quot; name=&quot;__codelineno-1-4&quot; href=&quot;#__codelineno-1-4&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\PostRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-5&quot; name=&quot;__codelineno-1-5&quot; href=&quot;#__codelineno-1-5&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-6&quot; name=&quot;__codelineno-1-6&quot; href=&quot;#__codelineno-1-6&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MockPostRepository&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PostRepository&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-7&quot; name=&quot;__codelineno-1-7&quot; href=&quot;#__codelineno-1-7&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-8&quot; name=&quot;__codelineno-1-8&quot; href=&quot;#__codelineno-1-8&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var int */&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-9&quot; name=&quot;__codelineno-1-9&quot; href=&quot;#__codelineno-1-9&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$expectedId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-10&quot; name=&quot;__codelineno-1-10&quot; href=&quot;#__codelineno-1-10&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-11&quot; name=&quot;__codelineno-1-11&quot; href=&quot;#__codelineno-1-11&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var Post */&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-12&quot; name=&quot;__codelineno-1-12&quot; href=&quot;#__codelineno-1-12&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-13&quot; name=&quot;__codelineno-1-13&quot; href=&quot;#__codelineno-1-13&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-14&quot; name=&quot;__codelineno-1-14&quot; href=&quot;#__codelineno-1-14&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;fm&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$expectedId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-15&quot; name=&quot;__codelineno-1-15&quot; href=&quot;#__codelineno-1-15&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-16&quot; name=&quot;__codelineno-1-16&quot; href=&quot;#__codelineno-1-16&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-17&quot; name=&quot;__codelineno-1-17&quot; href=&quot;#__codelineno-1-17&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;expectedId&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$expectedId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-18&quot; name=&quot;__codelineno-1-18&quot; href=&quot;#__codelineno-1-18&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-19&quot; name=&quot;__codelineno-1-19&quot; href=&quot;#__codelineno-1-19&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-20&quot; name=&quot;__codelineno-1-20&quot; href=&quot;#__codelineno-1-20&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$lockMode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$lockVersion&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-21&quot; name=&quot;__codelineno-1-21&quot; href=&quot;#__codelineno-1-21&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-22&quot; name=&quot;__codelineno-1-22&quot; href=&quot;#__codelineno-1-22&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;expectedId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-23&quot; name=&quot;__codelineno-1-23&quot; href=&quot;#__codelineno-1-23&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-24&quot; name=&quot;__codelineno-1-24&quot; href=&quot;#__codelineno-1-24&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-25&quot; name=&quot;__codelineno-1-25&quot; href=&quot;#__codelineno-1-25&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-26&quot; name=&quot;__codelineno-1-26&quot; href=&quot;#__codelineno-1-26&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-27&quot; name=&quot;__codelineno-1-27&quot; href=&quot;#__codelineno-1-27&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-28&quot; name=&quot;__codelineno-1-28&quot; href=&quot;#__codelineno-1-28&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;There are probably many ways to achieve that, but this is a good example.&lt;/p&gt;
&lt;p&gt;First, our mock needs to extend the class that we&apos;re mocking. Without this, we would get an error that our mock isn&apos;t a PostRepository, as we type hinted it in the PostService constructor.&lt;/p&gt;
&lt;p&gt;Then, you&apos;ll notice we&apos;re injecting a &lt;strong&gt;post&lt;/strong&gt; and an &lt;strong&gt;expectedId&lt;/strong&gt; into our mock constructor. Then, once we call &lt;strong&gt;find&lt;/strong&gt;, if the &lt;strong&gt;id&lt;/strong&gt; parameter is the expected one, we return our post. Otherwise we return null.&lt;/p&gt;
&lt;p&gt;We can then test both behavior without any real repository implementations (no database calls or complicated logic).&lt;/p&gt;
&lt;h3 id=&quot;mocking-the-entity-manager&quot;&gt;Mocking the entity manager&lt;/h3&gt;
&lt;p&gt;Now, let&apos;s have a look at the entity manager! In our PostService, you may have noticed that we actually inject the EntityManagerInterface. This means that our mock will need to implement the interface and all its methods. In this case, there is a lot of them! No problem though, we can simply leave all the ones we&apos;re not interested as empty.&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-2-1&quot; name=&quot;__codelineno-2-1&quot; href=&quot;#__codelineno-2-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\Tests\OwnMocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-2&quot; name=&quot;__codelineno-2-2&quot; href=&quot;#__codelineno-2-2&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-3&quot; name=&quot;__codelineno-2-3&quot; href=&quot;#__codelineno-2-3&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Doctrine\ORM\EntityManagerInterface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-4&quot; name=&quot;__codelineno-2-4&quot; href=&quot;#__codelineno-2-4&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Doctrine\ORM\Query\ResultSetMapping&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-5&quot; name=&quot;__codelineno-2-5&quot; href=&quot;#__codelineno-2-5&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-6&quot; name=&quot;__codelineno-2-6&quot; href=&quot;#__codelineno-2-6&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MockEntityManager&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;EntityManagerInterface&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-7&quot; name=&quot;__codelineno-2-7&quot; href=&quot;#__codelineno-2-7&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-8&quot; name=&quot;__codelineno-2-8&quot; href=&quot;#__codelineno-2-8&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$persistedObject&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-9&quot; name=&quot;__codelineno-2-9&quot; href=&quot;#__codelineno-2-9&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$flushed&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-10&quot; name=&quot;__codelineno-2-10&quot; href=&quot;#__codelineno-2-10&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-11&quot; name=&quot;__codelineno-2-11&quot; href=&quot;#__codelineno-2-11&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-12&quot; name=&quot;__codelineno-2-12&quot; href=&quot;#__codelineno-2-12&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-13&quot; name=&quot;__codelineno-2-13&quot; href=&quot;#__codelineno-2-13&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;persistedObject&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-14&quot; name=&quot;__codelineno-2-14&quot; href=&quot;#__codelineno-2-14&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-15&quot; name=&quot;__codelineno-2-15&quot; href=&quot;#__codelineno-2-15&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-16&quot; name=&quot;__codelineno-2-16&quot; href=&quot;#__codelineno-2-16&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;flush&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-17&quot; name=&quot;__codelineno-2-17&quot; href=&quot;#__codelineno-2-17&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-18&quot; name=&quot;__codelineno-2-18&quot; href=&quot;#__codelineno-2-18&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;flushed&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-19&quot; name=&quot;__codelineno-2-19&quot; href=&quot;#__codelineno-2-19&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-20&quot; name=&quot;__codelineno-2-20&quot; href=&quot;#__codelineno-2-20&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-21&quot; name=&quot;__codelineno-2-21&quot; href=&quot;#__codelineno-2-21&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;isPersisted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;bool&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-22&quot; name=&quot;__codelineno-2-22&quot; href=&quot;#__codelineno-2-22&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-23&quot; name=&quot;__codelineno-2-23&quot; href=&quot;#__codelineno-2-23&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;persistedObject&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-24&quot; name=&quot;__codelineno-2-24&quot; href=&quot;#__codelineno-2-24&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-25&quot; name=&quot;__codelineno-2-25&quot; href=&quot;#__codelineno-2-25&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-26&quot; name=&quot;__codelineno-2-26&quot; href=&quot;#__codelineno-2-26&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;hasFlushed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;bool&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-27&quot; name=&quot;__codelineno-2-27&quot; href=&quot;#__codelineno-2-27&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-28&quot; name=&quot;__codelineno-2-28&quot; href=&quot;#__codelineno-2-28&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;flushed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-29&quot; name=&quot;__codelineno-2-29&quot; href=&quot;#__codelineno-2-29&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-30&quot; name=&quot;__codelineno-2-30&quot; href=&quot;#__codelineno-2-30&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-31&quot; name=&quot;__codelineno-2-31&quot; href=&quot;#__codelineno-2-31&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** Defining all remaining EntityManager methods below */&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-32&quot; name=&quot;__codelineno-2-32&quot; href=&quot;#__codelineno-2-32&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getCache&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-33&quot; name=&quot;__codelineno-2-33&quot; href=&quot;#__codelineno-2-33&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getConnection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-34&quot; name=&quot;__codelineno-2-34&quot; href=&quot;#__codelineno-2-34&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getExpressionBuilder&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-35&quot; name=&quot;__codelineno-2-35&quot; href=&quot;#__codelineno-2-35&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;beginTransaction&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-36&quot; name=&quot;__codelineno-2-36&quot; href=&quot;#__codelineno-2-36&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;transactional&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-37&quot; name=&quot;__codelineno-2-37&quot; href=&quot;#__codelineno-2-37&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-38&quot; name=&quot;__codelineno-2-38&quot; href=&quot;#__codelineno-2-38&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;rollback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-39&quot; name=&quot;__codelineno-2-39&quot; href=&quot;#__codelineno-2-39&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;createQuery&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$dql&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-40&quot; name=&quot;__codelineno-2-40&quot; href=&quot;#__codelineno-2-40&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;createNamedQuery&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-41&quot; name=&quot;__codelineno-2-41&quot; href=&quot;#__codelineno-2-41&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;createNativeQuery&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$sql&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ResultSetMapping&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$rsm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-42&quot; name=&quot;__codelineno-2-42&quot; href=&quot;#__codelineno-2-42&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;createNamedNativeQuery&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-43&quot; name=&quot;__codelineno-2-43&quot; href=&quot;#__codelineno-2-43&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;createQueryBuilder&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-44&quot; name=&quot;__codelineno-2-44&quot; href=&quot;#__codelineno-2-44&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getReference&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$entityName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-45&quot; name=&quot;__codelineno-2-45&quot; href=&quot;#__codelineno-2-45&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getPartialReference&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$entityName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$identifier&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-46&quot; name=&quot;__codelineno-2-46&quot; href=&quot;#__codelineno-2-46&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-47&quot; name=&quot;__codelineno-2-47&quot; href=&quot;#__codelineno-2-47&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;copy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$entity&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$deep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-48&quot; name=&quot;__codelineno-2-48&quot; href=&quot;#__codelineno-2-48&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;lock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$entity&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$lockMode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$lockVersion&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-49&quot; name=&quot;__codelineno-2-49&quot; href=&quot;#__codelineno-2-49&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getEventManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-50&quot; name=&quot;__codelineno-2-50&quot; href=&quot;#__codelineno-2-50&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getConfiguration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-51&quot; name=&quot;__codelineno-2-51&quot; href=&quot;#__codelineno-2-51&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;isOpen&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-52&quot; name=&quot;__codelineno-2-52&quot; href=&quot;#__codelineno-2-52&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getUnitOfWork&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-53&quot; name=&quot;__codelineno-2-53&quot; href=&quot;#__codelineno-2-53&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getHydrator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$hydrationMode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-54&quot; name=&quot;__codelineno-2-54&quot; href=&quot;#__codelineno-2-54&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;newHydrator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$hydrationMode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-55&quot; name=&quot;__codelineno-2-55&quot; href=&quot;#__codelineno-2-55&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getProxyFactory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-56&quot; name=&quot;__codelineno-2-56&quot; href=&quot;#__codelineno-2-56&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getFilters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-57&quot; name=&quot;__codelineno-2-57&quot; href=&quot;#__codelineno-2-57&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;isFiltersStateClean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-58&quot; name=&quot;__codelineno-2-58&quot; href=&quot;#__codelineno-2-58&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;hasFilters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-59&quot; name=&quot;__codelineno-2-59&quot; href=&quot;#__codelineno-2-59&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$className&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-60&quot; name=&quot;__codelineno-2-60&quot; href=&quot;#__codelineno-2-60&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;remove&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-61&quot; name=&quot;__codelineno-2-61&quot; href=&quot;#__codelineno-2-61&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-62&quot; name=&quot;__codelineno-2-62&quot; href=&quot;#__codelineno-2-62&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;clear&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$objectName&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-63&quot; name=&quot;__codelineno-2-63&quot; href=&quot;#__codelineno-2-63&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;detach&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-64&quot; name=&quot;__codelineno-2-64&quot; href=&quot;#__codelineno-2-64&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;refresh&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-65&quot; name=&quot;__codelineno-2-65&quot; href=&quot;#__codelineno-2-65&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$className&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-66&quot; name=&quot;__codelineno-2-66&quot; href=&quot;#__codelineno-2-66&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getMetadataFactory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-67&quot; name=&quot;__codelineno-2-67&quot; href=&quot;#__codelineno-2-67&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;initializeObject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$obj&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-68&quot; name=&quot;__codelineno-2-68&quot; href=&quot;#__codelineno-2-68&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;contains&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-69&quot; name=&quot;__codelineno-2-69&quot; href=&quot;#__codelineno-2-69&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;fm&quot;&gt;__call&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$arguments&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-70&quot; name=&quot;__codelineno-2-70&quot; href=&quot;#__codelineno-2-70&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getClassMetadata&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$className&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-71&quot; name=&quot;__codelineno-2-71&quot; href=&quot;#__codelineno-2-71&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We implement the two methods used by our service : &lt;strong&gt;flush&lt;/strong&gt; and &lt;strong&gt;persist&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Then, as these methods don&apos;t return anything, we instead need the ability to check that they were correctly called.&lt;/p&gt;
&lt;p&gt;To do so, I added two methods that returns boolean values : &lt;strong&gt;isPersisted&lt;/strong&gt; and &lt;strong&gt;hasFlushed&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;We then simply set variables in our flush and persist methods, and verify their values in our added boolean methods.&lt;/p&gt;
&lt;h3 id=&quot;test-suite&quot;&gt;Test suite&lt;/h3&gt;
&lt;p&gt;Now that we have our mocks, let&apos;s write our actual tests!&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-3-1&quot; name=&quot;__codelineno-3-1&quot; href=&quot;#__codelineno-3-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\Tests\OwnMocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-2&quot; name=&quot;__codelineno-3-2&quot; href=&quot;#__codelineno-3-2&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-3-3&quot; name=&quot;__codelineno-3-3&quot; href=&quot;#__codelineno-3-3&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-4&quot; name=&quot;__codelineno-3-4&quot; href=&quot;#__codelineno-3-4&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App\PostService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-5&quot; name=&quot;__codelineno-3-5&quot; href=&quot;#__codelineno-3-5&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PHPUnit\Framework\TestCase&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-6&quot; name=&quot;__codelineno-3-6&quot; href=&quot;#__codelineno-3-6&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-3-7&quot; name=&quot;__codelineno-3-7&quot; href=&quot;#__codelineno-3-7&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PostServiceTest&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;TestCase&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-8&quot; name=&quot;__codelineno-3-8&quot; href=&quot;#__codelineno-3-8&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-9&quot; name=&quot;__codelineno-3-9&quot; href=&quot;#__codelineno-3-9&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;EXPECTED_ID&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-10&quot; name=&quot;__codelineno-3-10&quot; href=&quot;#__codelineno-3-10&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-3-11&quot; name=&quot;__codelineno-3-11&quot; href=&quot;#__codelineno-3-11&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var Post */&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-12&quot; name=&quot;__codelineno-3-12&quot; href=&quot;#__codelineno-3-12&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$expectedPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-13&quot; name=&quot;__codelineno-3-13&quot; href=&quot;#__codelineno-3-13&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-3-14&quot; name=&quot;__codelineno-3-14&quot; href=&quot;#__codelineno-3-14&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var MockPostRepository */&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-15&quot; name=&quot;__codelineno-3-15&quot; href=&quot;#__codelineno-3-15&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-16&quot; name=&quot;__codelineno-3-16&quot; href=&quot;#__codelineno-3-16&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-3-17&quot; name=&quot;__codelineno-3-17&quot; href=&quot;#__codelineno-3-17&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var MockEntityManager */&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-18&quot; name=&quot;__codelineno-3-18&quot; href=&quot;#__codelineno-3-18&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$entityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-19&quot; name=&quot;__codelineno-3-19&quot; href=&quot;#__codelineno-3-19&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-3-20&quot; name=&quot;__codelineno-3-20&quot; href=&quot;#__codelineno-3-20&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var PostService */&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-21&quot; name=&quot;__codelineno-3-21&quot; href=&quot;#__codelineno-3-21&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-22&quot; name=&quot;__codelineno-3-22&quot; href=&quot;#__codelineno-3-22&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-3-23&quot; name=&quot;__codelineno-3-23&quot; href=&quot;#__codelineno-3-23&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;setUp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-24&quot; name=&quot;__codelineno-3-24&quot; href=&quot;#__codelineno-3-24&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-25&quot; name=&quot;__codelineno-3-25&quot; href=&quot;#__codelineno-3-25&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;expectedPost&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-26&quot; name=&quot;__codelineno-3-26&quot; href=&quot;#__codelineno-3-26&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postRepository&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MockPostRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;expectedPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;EXPECTED_ID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-27&quot; name=&quot;__codelineno-3-27&quot; href=&quot;#__codelineno-3-27&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MockEntityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-28&quot; name=&quot;__codelineno-3-28&quot; href=&quot;#__codelineno-3-28&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;service&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PostService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-29&quot; name=&quot;__codelineno-3-29&quot; href=&quot;#__codelineno-3-29&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-30&quot; name=&quot;__codelineno-3-30&quot; href=&quot;#__codelineno-3-30&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-3-31&quot; name=&quot;__codelineno-3-31&quot; href=&quot;#__codelineno-3-31&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testGetPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-32&quot; name=&quot;__codelineno-3-32&quot; href=&quot;#__codelineno-3-32&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-33&quot; name=&quot;__codelineno-3-33&quot; href=&quot;#__codelineno-3-33&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;EXPECTED_ID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-34&quot; name=&quot;__codelineno-3-34&quot; href=&quot;#__codelineno-3-34&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-3-35&quot; name=&quot;__codelineno-3-35&quot; href=&quot;#__codelineno-3-35&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;assertSame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;expectedPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-36&quot; name=&quot;__codelineno-3-36&quot; href=&quot;#__codelineno-3-36&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-37&quot; name=&quot;__codelineno-3-37&quot; href=&quot;#__codelineno-3-37&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-3-38&quot; name=&quot;__codelineno-3-38&quot; href=&quot;#__codelineno-3-38&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testGetPost_PostNotFound&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-39&quot; name=&quot;__codelineno-3-39&quot; href=&quot;#__codelineno-3-39&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-40&quot; name=&quot;__codelineno-3-40&quot; href=&quot;#__codelineno-3-40&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;expectException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;\RuntimeException&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-41&quot; name=&quot;__codelineno-3-41&quot; href=&quot;#__codelineno-3-41&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-3-42&quot; name=&quot;__codelineno-3-42&quot; href=&quot;#__codelineno-3-42&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-43&quot; name=&quot;__codelineno-3-43&quot; href=&quot;#__codelineno-3-43&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-44&quot; name=&quot;__codelineno-3-44&quot; href=&quot;#__codelineno-3-44&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-3-45&quot; name=&quot;__codelineno-3-45&quot; href=&quot;#__codelineno-3-45&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testCreatePost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-46&quot; name=&quot;__codelineno-3-46&quot; href=&quot;#__codelineno-3-46&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-47&quot; name=&quot;__codelineno-3-47&quot; href=&quot;#__codelineno-3-47&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-48&quot; name=&quot;__codelineno-3-48&quot; href=&quot;#__codelineno-3-48&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;createPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-49&quot; name=&quot;__codelineno-3-49&quot; href=&quot;#__codelineno-3-49&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-3-50&quot; name=&quot;__codelineno-3-50&quot; href=&quot;#__codelineno-3-50&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;assertTrue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;isPersisted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-51&quot; name=&quot;__codelineno-3-51&quot; href=&quot;#__codelineno-3-51&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;assertTrue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;entityManager&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;hasFlushed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-52&quot; name=&quot;__codelineno-3-52&quot; href=&quot;#__codelineno-3-52&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-53&quot; name=&quot;__codelineno-3-53&quot; href=&quot;#__codelineno-3-53&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We create and inject our mocks via the setUp method of PHPUnit.&lt;/p&gt;
&lt;p&gt;Then, we can test how our service methods behave using our mocks.&lt;/p&gt;</description><link>https://blog.detassigny.net/mocking-in-php-1-writing-your-own-mocks/</link><source url="https://blog.detassigny.net/feed_rss_created.xml">$&gt; blog detassigny.net</source><pubDate>Sat, 02 Mar 2019 11:54:09 +0000</pubDate><guid isPermaLink="true">https://blog.detassigny.net/mocking-in-php-1-writing-your-own-mocks/</guid></item><item><title>You need to write tests</title><author>Gabriel de Tassigny</author><description>&lt;h1 id=&quot;you-need-to-write-tests&quot;&gt;You need to write tests&lt;/h1&gt;
&lt;p&gt;Writing unit tests at work should be one of your top priority!&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;In my first ever programming job, I remember hearing about unit tests a lot, but I simply didn&apos;t get the importance of them : &quot;Why do I need to waste time writing extra code to test my own code? I know how my code works!!&quot;&lt;/p&gt;
&lt;p&gt;It felt completely useless and also extremely boring. But boy, was I wrong! A few years later I progressively realised that unit tests are necessary in having a stable and ever-evolving professional code base.&lt;/p&gt;
&lt;h2 id=&quot;any-code-that-isnt-covered-by-unit-tests-is-legacy-code&quot;&gt;&quot;Any code that isn&apos;t covered by unit tests is legacy code&quot;&lt;/h2&gt;
&lt;p&gt;That&apos;s a bold statement, isn&apos;t it? I remember hearing it at a tech conference a while ago. For those who may not know, legacy code is basically code that we judge very hard to maintain and change, or even understand. Every tech company has it, to some extend. They&apos;re often due to change of mind, emergencies that we didn&apos;t clean later, or general bad maintainance of the code base.&lt;/p&gt;
&lt;p&gt;But surely you would say, if I write some very clean code right now, it&apos;s not legacy code! Even without unit test, right?&lt;/p&gt;
&lt;p&gt;Well, actually it is... or more exactly, it will be!&lt;/p&gt;
&lt;p&gt;Because, let&apos;s say that you write a brand new shiny class and its purpose is very clear... What makes you think that Bob the new software engineer in 5 years will understand it? Especially if you&apos;re not around anymore? And what if in those 5 years a lot of bug fixes, edge cases, and extra methods were added in your class? Well, you have it! Congratulations, you created legacy code! Sure, it wasn&apos;t ugly at the start, but it became so in the long run!&lt;/p&gt;
&lt;h2 id=&quot;understanding-the-purpose-of-tests&quot;&gt;Understanding the purpose of tests&lt;/h2&gt;
&lt;p&gt;One problem is that junior developers tend to not understand the actual purpose for unit tests. That was my mistake too back in the days.&lt;/p&gt;
&lt;p&gt;It&apos;s not really about testing right away that your new code works (although it can help you achieve that!). It&apos;s about writing a contract on how your code is supposed to behave and what&apos;s expected of it. By defining all the expected outcomes of your class / method / function, you simply show what the intent of your code is.&lt;/p&gt;
&lt;p&gt;One of the main issue with software engineering is of time : code bases evolve and go through several teams of developers all with different ideas and new tech trends they want to try out. The code gets old, messy, and hard to understand.&lt;/p&gt;
&lt;p&gt;Therefore, defining a contract that tells future developers what each part of the code was intended to do is fundamental.&lt;/p&gt;
&lt;p&gt;It means that :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;new features added in the code can be done with more confidence as tests might break if bugs are introduced&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;refactoring can be done more easily for the same reason&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;unit tests can be read to give some context on what to expect (in case the production code isn&apos;t clear enough)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><link>https://blog.detassigny.net/you-need-to-write-tests/</link><source url="https://blog.detassigny.net/feed_rss_created.xml">$&gt; blog detassigny.net</source><pubDate>Thu, 10 Jan 2019 22:59:33 +0000</pubDate><guid isPermaLink="true">https://blog.detassigny.net/you-need-to-write-tests/</guid></item><item><title>I gave up on Android</title><author>Gabriel de Tassigny</author><description>&lt;h1 id=&quot;i-gave-up-on-android&quot;&gt;I gave up on Android&lt;/h1&gt;
&lt;p&gt;I had been using Google&apos;s mobile OS for a while, but now it&apos;s time to say goodbye...&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;This is the story of why I used Android phones, and why I recently switched to iOS. Therefore, I will talk about both Google and Apple since they&apos;re the only two real options on this market.&lt;/p&gt;
&lt;p&gt;Let&apos;s be clear, I always enjoyed Apple products. However, they tend to be a bit pricey.&lt;/p&gt;
&lt;p&gt;While I&apos;m okay in buying an expensive computer as I tend to use them for work related stuff, I find it harder to justify spending around €1,000 for a phone. Therefore, I used to mostly look at mid-range android phones (from €300 to €500). In theory, they fit my need of a lower price phone that does everything I need well enough. I always found iOS to be the better operating system, however android was good enough for me as I could save €500!&lt;/p&gt;
&lt;p&gt;But I give up on that now for multiple reasons... Please note that some of these reasons might not be an issue on very expensive android phones, but as I said, I honestly prefer iOS for a similar price.&lt;/p&gt;
&lt;p&gt;Anyway, let&apos;s go into details on why I gave up on Android!&lt;/p&gt;
&lt;h2 id=&quot;google&quot;&gt;Google&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;Google Data Monster&quot; src=&quot;../images/Google-Data-Monster-1545661314.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Oh, Google... There would be so much to say about this company, but I&apos;m going to be brief. Let&apos;s just say that over the years I&apos;ve tend to lose respect for Google more and more.&lt;/p&gt;
&lt;p&gt;This is of course mostly related to the privacy issues. Overall, I feel that I really can&apos;t trust this company with my data anymore.&lt;/p&gt;
&lt;p&gt;Just have a look over this &lt;a href=&quot;https://en.wikipedia.org/wiki/Privacy_concerns_regarding_Google&quot;&gt;wikipedia page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Apple tends to respect more its users so I&apos;m glad to join them on that aspect.&lt;/p&gt;
&lt;p&gt;I had a look many times at setting up somehow a Googleless Android, but roms are complicated to install, and not always well maintained depending on your device. Also, some android apps and services may still requires you sign-in using a Google account.&lt;/p&gt;
&lt;h2 id=&quot;a-dying-phone&quot;&gt;A dying phone&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;Moto X play&quot; src=&quot;../images/moto-x-play-1545661394.jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This is my (now former) android phone: A Motorola Moto X Play.&lt;/p&gt;
&lt;p&gt;When I bought it two and a half years ago, it was at a decent price, had some of the best online reviews, and was powerful enough for my needs.&lt;/p&gt;
&lt;p&gt;I was really happy with it... for about a year and a half. Then everything progressively started to fall apart!&lt;/p&gt;
&lt;p&gt;First and foremost, my micro USB port was getting worse and worse. I had to do this trick I found online of using a sharp stick to replace it properly almost every week so that I can somehow manage to charge my phone. In the last few months, it sometimes took me several minutes for me to manage to find the sweet spot where my phone would accept to charge. And then I had to make sure my phone wouldn&apos;t move at all, else I would start over again. And some micro usb cables simply wouldn&apos;t work at all anymore! So I sometimes couldn&apos;t charge my phone in my friends&apos; house. Extremely annoying!&lt;/p&gt;
&lt;p&gt;Speaking of battery, my phone would also randomly shut down saying the battery level was at zero even though I had plenty left. It would then be able to turn back on, so there definitely was some battery left. This would mostly happen when using resource heavy applications (the camera most often triggered it, but Google Maps would do it too sometimes). I like traveling a lot so having my phone shutdown when I&apos;m trying to take pictures in the middle of Kyoto or Seoul was very painful.&lt;/p&gt;
&lt;p&gt;Another issue I had was that my flashlight completely stopped working 4 months ago, after an OS update. Thanks for the update Google!&lt;/p&gt;
&lt;p&gt;One other time, around 6 months ago, I tried to migrate data from the internal memory towards the micro SD card. I used the system tool that is part of Android for that, so it should be all ok, right? Haha, well no. Actually it failed somehow, but more importantly it managed to make the android back button stop working completely. If you have an android phone, I challenge you to try using yours for an hour without that button. After hours of attempts and online research, I managed to fix it by installing a completely different Launcher... What the hell, Android!&lt;/p&gt;
&lt;h2 id=&quot;alternatives&quot;&gt;Alternatives?&lt;/h2&gt;
&lt;p&gt;So after all this, I gave up. Sorry Google! It&apos;s not me, it&apos;s definitely you! You and your lack of respect for my online privacy. You and your OS that seems to mostly work but that gave me so many headaches!&lt;/p&gt;
&lt;p&gt;Ultimately, I started to look at alternatives, and let&apos;s be honest there is a big lack of alternatives!&lt;/p&gt;
&lt;p&gt;There is only one real one in Apple&apos;s iOS. I bought an iPhone XR and I like it so far. However, I wish there was some true open source alternative. Basically, what Linux is for computers. Hopefully this will happen some day, but I doubt it...&lt;/p&gt;</description><link>https://blog.detassigny.net/i-gave-up-on-android/</link><source url="https://blog.detassigny.net/feed_rss_created.xml">$&gt; blog detassigny.net</source><pubDate>Mon, 24 Dec 2018 14:46:33 +0000</pubDate><guid isPermaLink="true">https://blog.detassigny.net/i-gave-up-on-android/</guid></item><item><title>Design Pattern #2: Dependency Injection</title><author>Gabriel de Tassigny</author><description>&lt;h1 id=&quot;design-pattern-2-dependency-injection&quot;&gt;Design Pattern #2: Dependency Injection&lt;/h1&gt;
&lt;p&gt;A very useful pattern to keep your application clean and enable unit testing&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;In the previous design pattern article, I went over the &lt;a href=&quot;../design-pattern-1-value-object/&quot;&gt;Value Object&lt;/a&gt; pattern.&lt;/p&gt;
&lt;p&gt;This time I will talk about how and why you should use dependency injection. Personally, this may be the design pattern that I use the most, and it&apos;s generally very common so if you don&apos;t know it, I strongly encourage you to learn about it!&lt;/p&gt;
&lt;p&gt;I&apos;m personally a bit annoyed about articles that uses cats and dogs, or wheels and cars as examples for this kind of stuff. It doesn&apos;t reflect what people usually work on. Therefore, I will instead use real life examples, mostly taken from &lt;a href=&quot;https://github.com/gabriel-detassigny/simple-blog&quot;&gt;this blog&apos;s source code&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;whats-dependency-injection-and-how-do-i-use-it&quot;&gt;What&apos;s dependency injection and how do I use it?&lt;/h2&gt;
&lt;p&gt;Let&apos;s say you have a class, and that class has some dependencies on other classes.&lt;/p&gt;
&lt;p&gt;In our case, I have a service class to retrieve a blog post (such as the one you&apos;re reading right now) for a given ID, and its dependency is a doctrine repository that is in charge of connecting to the database and retrieve that post.&lt;/p&gt;
&lt;p&gt;Well, one naive way to have your main class using your dependencies might be to declare its dependency inside it.&lt;/p&gt;
&lt;p&gt;Like this :&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-0-1&quot; name=&quot;__codelineno-0-1&quot; href=&quot;#__codelineno-0-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PostViewingService&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-2&quot; name=&quot;__codelineno-0-2&quot; href=&quot;#__codelineno-0-2&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-3&quot; name=&quot;__codelineno-0-3&quot; href=&quot;#__codelineno-0-3&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var PostRepository */&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-4&quot; name=&quot;__codelineno-0-4&quot; href=&quot;#__codelineno-0-4&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$repository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-5&quot; name=&quot;__codelineno-0-5&quot; href=&quot;#__codelineno-0-5&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-6&quot; name=&quot;__codelineno-0-6&quot; href=&quot;#__codelineno-0-6&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;fm&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-7&quot; name=&quot;__codelineno-0-7&quot; href=&quot;#__codelineno-0-7&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-8&quot; name=&quot;__codelineno-0-8&quot; href=&quot;#__codelineno-0-8&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;c1&quot;&gt;// Create doctrine entity manager, and then get the repository from it&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-9&quot; name=&quot;__codelineno-0-9&quot; href=&quot;#__codelineno-0-9&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$config&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Setup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;createAnnotationMetadataConfiguration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;__DIR__&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;/Entity&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-10&quot; name=&quot;__codelineno-0-10&quot; href=&quot;#__codelineno-0-10&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$em&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;EntityManager&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;driver =&amp;gt; &apos;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;pdo_mysql&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;, &apos;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos; =&amp;gt; &apos;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-11&quot; name=&quot;__codelineno-0-11&quot; href=&quot;#__codelineno-0-11&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;repository&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$em&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-12&quot; name=&quot;__codelineno-0-12&quot; href=&quot;#__codelineno-0-12&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-13&quot; name=&quot;__codelineno-0-13&quot; href=&quot;#__codelineno-0-13&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-14&quot; name=&quot;__codelineno-0-14&quot; href=&quot;#__codelineno-0-14&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-15&quot; name=&quot;__codelineno-0-15&quot; href=&quot;#__codelineno-0-15&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-16&quot; name=&quot;__codelineno-0-16&quot; href=&quot;#__codelineno-0-16&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;sd&quot;&gt;/** @var Post $post */&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-17&quot; name=&quot;__codelineno-0-17&quot; href=&quot;#__codelineno-0-17&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-18&quot; name=&quot;__codelineno-0-18&quot; href=&quot;#__codelineno-0-18&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-19&quot; name=&quot;__codelineno-0-19&quot; href=&quot;#__codelineno-0-19&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-20&quot; name=&quot;__codelineno-0-20&quot; href=&quot;#__codelineno-0-20&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PostNotFoundException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Post with ID &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; was not found&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-21&quot; name=&quot;__codelineno-0-21&quot; href=&quot;#__codelineno-0-21&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-22&quot; name=&quot;__codelineno-0-22&quot; href=&quot;#__codelineno-0-22&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-23&quot; name=&quot;__codelineno-0-23&quot; href=&quot;#__codelineno-0-23&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-24&quot; name=&quot;__codelineno-0-24&quot; href=&quot;#__codelineno-0-24&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-25&quot; name=&quot;__codelineno-0-25&quot; href=&quot;#__codelineno-0-25&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-0-26&quot; name=&quot;__codelineno-0-26&quot; href=&quot;#__codelineno-0-26&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PostRepository&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;EntityRepository&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-27&quot; name=&quot;__codelineno-0-27&quot; href=&quot;#__codelineno-0-27&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-28&quot; name=&quot;__codelineno-0-28&quot; href=&quot;#__codelineno-0-28&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That would work! You would be able to use your service, and it definitely has an instance of the repository created in its constructor. However, the constructor is now polluted with all the logic of how to create the repository.&lt;/p&gt;
&lt;p&gt;This is how it would look instead using dependency injection :&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-1-1&quot; name=&quot;__codelineno-1-1&quot; href=&quot;#__codelineno-1-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PostViewingService&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-2&quot; name=&quot;__codelineno-1-2&quot; href=&quot;#__codelineno-1-2&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-3&quot; name=&quot;__codelineno-1-3&quot; href=&quot;#__codelineno-1-3&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var PostRepository */&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-4&quot; name=&quot;__codelineno-1-4&quot; href=&quot;#__codelineno-1-4&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$repository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-5&quot; name=&quot;__codelineno-1-5&quot; href=&quot;#__codelineno-1-5&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-6&quot; name=&quot;__codelineno-1-6&quot; href=&quot;#__codelineno-1-6&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;fm&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;PostRepository&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-7&quot; name=&quot;__codelineno-1-7&quot; href=&quot;#__codelineno-1-7&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-8&quot; name=&quot;__codelineno-1-8&quot; href=&quot;#__codelineno-1-8&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;repository&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-9&quot; name=&quot;__codelineno-1-9&quot; href=&quot;#__codelineno-1-9&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-10&quot; name=&quot;__codelineno-1-10&quot; href=&quot;#__codelineno-1-10&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-11&quot; name=&quot;__codelineno-1-11&quot; href=&quot;#__codelineno-1-11&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-12&quot; name=&quot;__codelineno-1-12&quot; href=&quot;#__codelineno-1-12&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-13&quot; name=&quot;__codelineno-1-13&quot; href=&quot;#__codelineno-1-13&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;sd&quot;&gt;/** @var Post $post */&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-14&quot; name=&quot;__codelineno-1-14&quot; href=&quot;#__codelineno-1-14&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-15&quot; name=&quot;__codelineno-1-15&quot; href=&quot;#__codelineno-1-15&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-16&quot; name=&quot;__codelineno-1-16&quot; href=&quot;#__codelineno-1-16&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-17&quot; name=&quot;__codelineno-1-17&quot; href=&quot;#__codelineno-1-17&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PostNotFoundException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Post with ID &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$id&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; was not found&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-18&quot; name=&quot;__codelineno-1-18&quot; href=&quot;#__codelineno-1-18&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-19&quot; name=&quot;__codelineno-1-19&quot; href=&quot;#__codelineno-1-19&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-20&quot; name=&quot;__codelineno-1-20&quot; href=&quot;#__codelineno-1-20&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-21&quot; name=&quot;__codelineno-1-21&quot; href=&quot;#__codelineno-1-21&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-22&quot; name=&quot;__codelineno-1-22&quot; href=&quot;#__codelineno-1-22&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-23&quot; name=&quot;__codelineno-1-23&quot; href=&quot;#__codelineno-1-23&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PostRepository&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;EntityRepository&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-24&quot; name=&quot;__codelineno-1-24&quot; href=&quot;#__codelineno-1-24&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-25&quot; name=&quot;__codelineno-1-25&quot; href=&quot;#__codelineno-1-25&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Isn&apos;t that cleaner? Now, of course you&apos;ll still need to create the repository somewhere beforehand to pass it into the service.&lt;/p&gt;
&lt;p&gt;However, it makes your code way easier to read. And there are more advantages than just code readability too...&lt;/p&gt;
&lt;h2 id=&quot;why-should-i-use-this&quot;&gt;Why should I use this?&lt;/h2&gt;
&lt;h3 id=&quot;centralize-your-instantiations&quot;&gt;Centralize your instantiations&lt;/h3&gt;
&lt;p&gt;One reason you may want to use dependency injection is to have your instantiations written in one place only. Using our previous example, what would happen if I added another service that needs the PostRepository?&lt;/p&gt;
&lt;p&gt;If the repository was instantiated in the services constructor as we did first, the new service would need to do the same! It means we would duplicate that ugly code to retrieve the repository from the doctrine entity manager.&lt;/p&gt;
&lt;p&gt;However, using dependency injection, we can simply pass the same instance of the repository to both services, and avoid having duplicated code.&lt;/p&gt;
&lt;p&gt;Having no duplication of that code means that if we ever need to change how that repository is created, we can change it in one place only.&lt;/p&gt;
&lt;p&gt;Now, if you don&apos;t know how to handle these instantiations, I suggest having a look at containers, such as &lt;a href=&quot;https://container.thephpleague.com/&quot;&gt;this one&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;unit-testing&quot;&gt;Unit testing&lt;/h3&gt;
&lt;p&gt;Another huge advantage to dependency injection is that it allows us to unit test our code easily.&lt;/p&gt;
&lt;p&gt;Indeed, if you wanted to test the behaviour of the &lt;em&gt;getPost&lt;/em&gt; method on our service, you would need to have a database setup for the test, and therefore you would test both the service and its dependency (the repository). While this isn&apos;t necessarily a bad idea, it can be quite difficult and slow. Furthermore, it would be closer to an integration test than a unit test.&lt;/p&gt;
&lt;p&gt;Instead, dependency injection allows us to use &lt;a href=&quot;https://en.wikipedia.org/wiki/Mock_object&quot;&gt;Mocks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here is how tests could look like using PHPUnit and &lt;a href=&quot;https://github.com/mlively/Phake&quot;&gt;Phake&lt;/a&gt; as a mocking library :&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-2-1&quot; name=&quot;__codelineno-2-1&quot; href=&quot;#__codelineno-2-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PostViewingServiceTest&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;TestCase&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-2&quot; name=&quot;__codelineno-2-2&quot; href=&quot;#__codelineno-2-2&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-3&quot; name=&quot;__codelineno-2-3&quot; href=&quot;#__codelineno-2-3&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var PostViewingService */&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-4&quot; name=&quot;__codelineno-2-4&quot; href=&quot;#__codelineno-2-4&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-5&quot; name=&quot;__codelineno-2-5&quot; href=&quot;#__codelineno-2-5&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-6&quot; name=&quot;__codelineno-2-6&quot; href=&quot;#__codelineno-2-6&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;sd&quot;&gt;/** @var PostRepository */&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-7&quot; name=&quot;__codelineno-2-7&quot; href=&quot;#__codelineno-2-7&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$repository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-8&quot; name=&quot;__codelineno-2-8&quot; href=&quot;#__codelineno-2-8&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-9&quot; name=&quot;__codelineno-2-9&quot; href=&quot;#__codelineno-2-9&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;setUp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-10&quot; name=&quot;__codelineno-2-10&quot; href=&quot;#__codelineno-2-10&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-11&quot; name=&quot;__codelineno-2-11&quot; href=&quot;#__codelineno-2-11&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;repository&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Phake&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;mock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;PostRepository&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-12&quot; name=&quot;__codelineno-2-12&quot; href=&quot;#__codelineno-2-12&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;service&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PostViewingService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-13&quot; name=&quot;__codelineno-2-13&quot; href=&quot;#__codelineno-2-13&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-14&quot; name=&quot;__codelineno-2-14&quot; href=&quot;#__codelineno-2-14&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-15&quot; name=&quot;__codelineno-2-15&quot; href=&quot;#__codelineno-2-15&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testGetPost_NotFound&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-16&quot; name=&quot;__codelineno-2-16&quot; href=&quot;#__codelineno-2-16&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-17&quot; name=&quot;__codelineno-2-17&quot; href=&quot;#__codelineno-2-17&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;expectException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;PostNotFoundException&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-18&quot; name=&quot;__codelineno-2-18&quot; href=&quot;#__codelineno-2-18&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-19&quot; name=&quot;__codelineno-2-19&quot; href=&quot;#__codelineno-2-19&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nx&quot;&gt;Phake&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;when&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;POST_ID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;thenReturn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-20&quot; name=&quot;__codelineno-2-20&quot; href=&quot;#__codelineno-2-20&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-21&quot; name=&quot;__codelineno-2-21&quot; href=&quot;#__codelineno-2-21&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-22&quot; name=&quot;__codelineno-2-22&quot; href=&quot;#__codelineno-2-22&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-23&quot; name=&quot;__codelineno-2-23&quot; href=&quot;#__codelineno-2-23&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-24&quot; name=&quot;__codelineno-2-24&quot; href=&quot;#__codelineno-2-24&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testGetPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-25&quot; name=&quot;__codelineno-2-25&quot; href=&quot;#__codelineno-2-25&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-26&quot; name=&quot;__codelineno-2-26&quot; href=&quot;#__codelineno-2-26&quot;&gt;&lt;/a&gt;         &lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-27&quot; name=&quot;__codelineno-2-27&quot; href=&quot;#__codelineno-2-27&quot;&gt;&lt;/a&gt;         &lt;span class=&quot;nx&quot;&gt;Phake&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;when&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;POST_ID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;thenReturn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-28&quot; name=&quot;__codelineno-2-28&quot; href=&quot;#__codelineno-2-28&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-29&quot; name=&quot;__codelineno-2-29&quot; href=&quot;#__codelineno-2-29&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getPost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-30&quot; name=&quot;__codelineno-2-30&quot; href=&quot;#__codelineno-2-30&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-31&quot; name=&quot;__codelineno-2-31&quot; href=&quot;#__codelineno-2-31&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;assertSame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-32&quot; name=&quot;__codelineno-2-32&quot; href=&quot;#__codelineno-2-32&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here we create a mock of the repository and inject it into our service. This means we don&apos;t need any database at all!&lt;/p&gt;
&lt;p&gt;We can then define the mocks behaviour in our two test scenarios :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;if the repository returns null, the service method should throw an exception&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;if the repository returns a &lt;em&gt;Post&lt;/em&gt; entity, the service method should return it&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&apos;re not too familiar with unit tests and mocks, I strongly suggest having a look at them as they&apos;re very big parts of software engineering.&lt;/p&gt;</description><link>https://blog.detassigny.net/design-pattern-2-dependency-injection/</link><source url="https://blog.detassigny.net/feed_rss_created.xml">$&gt; blog detassigny.net</source><pubDate>Thu, 06 Dec 2018 06:32:07 +0000</pubDate><guid isPermaLink="true">https://blog.detassigny.net/design-pattern-2-dependency-injection/</guid></item><item><title>Managing my passwords with KeePass and OwnCloud</title><author>Gabriel de Tassigny</author><description>&lt;h1 id=&quot;managing-my-passwords-with-keepass-and-owncloud&quot;&gt;Managing my passwords with KeePass and OwnCloud&lt;/h1&gt;
&lt;p&gt;I had been trying to find the perfect setup for managing my passwords for a while, and I think I&apos;m getting close.&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;If you don&apos;t really trust online password managers like me, you might also want to manage your passwords offline.&lt;/p&gt;
&lt;p&gt;Enters KeePass!&lt;/p&gt;
&lt;h2 id=&quot;keepass-keepassx-keepassxc&quot;&gt;KeePass / KeePassX / KeePassXC&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;KeePass logo&quot; src=&quot;../images/keepass-1543825329.jpg&quot; /&gt;&lt;img alt=&quot;KeePassX logo&quot; src=&quot;../images/keepassx-1543825710.jpg&quot; /&gt; &lt;img alt=&quot;KeePassXC&quot; src=&quot;../images/keepassXC-1543825349.jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;To sum it up, &lt;strong&gt;KeePass&lt;/strong&gt; was originally an open-source offline password manager on windows. It basically created its own format for storing your database file of credentials, and you set up a master password to access the database using the software.&lt;/p&gt;
&lt;p&gt;It also allows you to generate random passwords.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KeePassX&lt;/strong&gt; was then created as an attempt to have a linux version of it. (Although I think that nowadays both KeePass and KeePassX are actually cross-platform applications).&lt;/p&gt;
&lt;p&gt;After a while, a big part of the keepass community decided to fork KeePassX and created &lt;strong&gt;KeePassXC&lt;/strong&gt; (for slow development reasons on the former, apparently).&lt;/p&gt;
&lt;p&gt;KeePassXC also has a way nicer UI / UX than it&apos;s predecessor in my opinion. Furthermore, it runs on Mac OS / Linux / Windows.&lt;/p&gt;
&lt;p&gt;The concept is the same : you have a local encrypted database file containing all your passwords and can access them using a master password.&lt;/p&gt;
&lt;p&gt;I&apos;ve been using KeePassXC for a while now on my macbook, and I have to admit that I can&apos;t complain about anything. It&apos;s a great application!&lt;/p&gt;
&lt;h2 id=&quot;what-about-smartphones&quot;&gt;What about smartphones?&lt;/h2&gt;
&lt;p&gt;Well, I personally own an Android phone (although I&apos;m probably going to switch to iOS soon, but more on that in another post later...)&lt;/p&gt;
&lt;p&gt;I am using an application called &lt;strong&gt;KeePass2Android.&lt;/strong&gt; There are others, but that&apos;s the one I preferred.&lt;/p&gt;
&lt;p&gt;It also uses a local file to store your password.&lt;/p&gt;
&lt;h2 id=&quot;keep-it-in-sync&quot;&gt;Keep it in sync&lt;/h2&gt;
&lt;p&gt;Now, you&apos;re probably wondering : how do I keep the 2 databases (computer and phone) in sync?&lt;/p&gt;
&lt;p&gt;Well, there are multiple solutions for that : Dropbox, Google Drive, BT Sync (now renamed resilio sync)...&lt;/p&gt;
&lt;p&gt;I personally used a private owncloud server that I have an access to, but other options can be more straightforward!&lt;/p&gt;
&lt;p&gt;Usually, KeePass applications can have two ways of accessing that data :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;they can support directly your specific cloud storage&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;they can read from a local file which means you&apos;ll have to have another application in charge of syncing to your cloud&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I went with the latter simply because my keepass applications didn&apos;t support OwnCloud! In any case, once I installed OwnCloud on mac and android and configured them I never had to open them again so it&apos;s not so bad.&lt;/p&gt;
&lt;h2 id=&quot;browser-completion&quot;&gt;Browser completion&lt;/h2&gt;
&lt;p&gt;I started looking at browser auto-completion recently and for now I&apos;m using &lt;a href=&quot;https://github.com/subdavis/Tusk&quot; title=&quot;KeePass Tusk&quot;&gt;KeePass Tusk&lt;/a&gt; (available on Chrome and Firefox).&lt;/p&gt;
&lt;p&gt;The big drawback I have with it is that the only way for it to access my database in owncloud is through a publicly available link there, which isn&apos;t great. I wish it could either read from the local file on my computer, or connect to owncloud directly.&lt;/p&gt;
&lt;p&gt;In practice, it means I wouldn&apos;t need to expose the database through an URL. That database is password protected and good luck finding the link, but still, it&apos;s not ideal in my opinion!&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Obviously this is my personal setup and it&apos;s not for everyone. Each of the tools I mentioned have some alternatives too! KeePass isn&apos;t the only player in the game (I heard &lt;a href=&quot;https://www.passwordstore.org/&quot;&gt;pass&lt;/a&gt; is very good too).&lt;/p&gt;
&lt;p&gt;However, I hope it proves that you can really store and access your passwords the way you want! You shouldn&apos;t use a tool you don&apos;t feel comfortable keeping your credentials.&lt;/p&gt;</description><link>https://blog.detassigny.net/managing-my-passwords-with-keepass-and-owncloud/</link><source url="https://blog.detassigny.net/feed_rss_created.xml">$&gt; blog detassigny.net</source><pubDate>Mon, 03 Dec 2018 09:06:19 +0000</pubDate><guid isPermaLink="true">https://blog.detassigny.net/managing-my-passwords-with-keepass-and-owncloud/</guid></item><item><title>Going Frameworkless</title><author>Gabriel de Tassigny</author><description>&lt;h1 id=&quot;going-frameworkless&quot;&gt;Going Frameworkless&lt;/h1&gt;
&lt;p&gt;Why I think everyone should try web developing without a framework&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;About a year ago, I decided that I wanted to start my own tech blog at some point.&lt;/p&gt;
&lt;p&gt;But that started in my head a long internal debate : What should I use to write my blog? Should I follow today&apos;s trend and use &lt;a href=&quot;https://medium.com/&quot;&gt;medium.com&lt;/a&gt;? Should I self-host a Wordpress blog?&lt;/p&gt;
&lt;p&gt;After some thinking, I also realised that I didn&apos;t have any side project to work on at the moment, so I might as well write my own blog!&lt;/p&gt;
&lt;p&gt;Then came the decision of which languages / frameworks to use? Ruby On Rails? PHP with Symfony? Laravel? Some new trendy language?&lt;/p&gt;
&lt;p&gt;After some more thinking, I remembered a &lt;a href=&quot;https://www.meetup.com/PHP-Dublin/&quot;&gt;PHP meetup&lt;/a&gt; I went to in Dublin, where one of the member talked about writing a PHP application without any framework. That&apos;s it! Why not write my own blog in PHP 7, but no framework?&lt;/p&gt;
&lt;p&gt;Of all the above options, I probably chose the longest to implement...&lt;/p&gt;
&lt;p&gt;But in the end, I don&apos;t regret it at all!&lt;/p&gt;
&lt;p&gt;This is my story of &quot;going frameworkless&quot; and why I think every PHP developer (and perhaps other devs too?) should try it at least once.&lt;/p&gt;
&lt;h2 id=&quot;composer-packages&quot;&gt;Composer packages&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;Composer&quot; src=&quot;../images/composer-1543725507.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;First of all, I didn&apos;t exactly write everything from scratch... Sure, that would be an option as well but I&apos;m not that masochist!&lt;/p&gt;
&lt;p&gt;Instead, I used a few composer packages to handle specific tasks that I didn&apos;t want to implement myself :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Doctrine&lt;/strong&gt; was used for managing entities and DB persistency&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Twig&lt;/strong&gt; for frontend&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nikic/FastRoute&quot;&gt;FastRoute&lt;/a&gt; for request routing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;phpdotenv&lt;/strong&gt; for managing env variables&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;... and a few other ones!&lt;/p&gt;
&lt;p&gt;In the end, I spent a good amount of time just writing the glue between these various packages that I chose.&lt;/p&gt;
&lt;h2 id=&quot;what-to-write-vs-what-to-borrow&quot;&gt;What to write vs what to borrow&lt;/h2&gt;
&lt;p&gt;I think the general advice I would give is to write what you want to write yourself, and use a package for anything else you don&apos;t really feel like implementing.&lt;/p&gt;
&lt;p&gt;For instance, I wrote my own container to manage my dependencies. I could have used an existing package for that, but I felt interested in writing my own implementation of the &lt;a href=&quot;https://www.php-fig.org/psr/psr-11/&quot;&gt;PSR-11 Container Interface&lt;/a&gt;. My implementation is probably worse than most packages, but I&apos;m still proud of it anyway! And believe it or not, I had a lot of fun writing it!&lt;/p&gt;
&lt;p&gt;But if for some reasons you&apos;re wondering how you would go at writing your own DB persistency layer, then go ahead! You&apos;ll definitely learn a lot!&lt;/p&gt;
&lt;p&gt;That&apos;s the first and probably the biggest reason I would advise in going frameworkless : &lt;em&gt;You&apos;ll have the opportunity to write code you would never write otherwise.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;performance&quot;&gt;Performance&lt;/h2&gt;
&lt;p&gt;One other reason you might want to avoid using a framework could be performance. I really haven&apos;t looked at that too much when writing my blog to be honest, and probably I could spend some time optimising it.&lt;/p&gt;
&lt;p&gt;However, you do end up with mostly code that you wrote yourself, or at least specific packages that you cherry picked. It means you know what to expect and you don&apos;t have a big overhead that a whole framework could introduce.&lt;/p&gt;
&lt;h2 id=&quot;writing-your-own-framework&quot;&gt;Writing your own framework&lt;/h2&gt;
&lt;p&gt;Did you ever think about writing a framework yourself?&lt;/p&gt;
&lt;p&gt;If you decide to go frameworkless, ask yourself this question in the end : Did you actually end up writing your own one?&lt;/p&gt;
&lt;p&gt;You might actually really like the way you glued all the pieces necessary for your application/blog/website, why not try to make it a separate framework?&lt;/p&gt;
&lt;p&gt;I haven&apos;t gone that far yet, and probably never will... but it&apos;s definitely the only time I&apos;ve at least considered it. The code I write definitely has some pieces that looks shaped like the beginning of a framework.&lt;/p&gt;
&lt;p&gt;I&apos;ve met developers who attempted to write their own framework before. I truly believe that would be the best way to do so. You need a pet project to determine how your framework would look like!&lt;/p&gt;
&lt;h2 id=&quot;what-ive-learned&quot;&gt;What I&apos;ve learned&lt;/h2&gt;
&lt;p&gt;Just to be clear : I really like frameworks! They let you write projects with all the scaffolding already in place and good ones are usually well documented too. I&apos;m not saying you should stop using them completely.&lt;/p&gt;
&lt;p&gt;However, the learning experience I&apos;ve had really makes me think that you should try once not using one!&lt;/p&gt;
&lt;p&gt;It gave me the chance to write a lot of PHP code, to discover specific packages for specific tasks (e.g. routing is usually included in frameworks so I never had the chance to discover fast-route before), and also to simply have fun!&lt;/p&gt;
&lt;p&gt;I don&apos;t think I would have enjoyed as much creating a medium account, or installing wordpress. Developing a blog in Laravel would have been okay, but a blog isn&apos;t that complicated so that would have been done quite quickly.&lt;/p&gt;
&lt;p&gt;Instead, I spent some time thinking on how to implement specific parts of the system, how to have a container that behaves the way I would expect, how to handle errors, etc.&lt;/p&gt;
&lt;p&gt;That would be my final reason for going frameworkless on a side project : Have you ever had a moment where you wanted to work on some programming side project but didn&apos;t have any new exciting idea? Well, maybe that could be the one! Just write a simple site or application but without any framework! I guarantee you will have some challenges and some fun!&lt;/p&gt;
&lt;p&gt;If you&apos;re interested in having a look at the source code of this blog, &lt;a href=&quot;https://github.com/gabriel-detassigny/simple-blog&quot;&gt;feel free&lt;/a&gt;.&lt;/p&gt;</description><link>https://blog.detassigny.net/going-frameworkless/</link><source url="https://blog.detassigny.net/feed_rss_created.xml">$&gt; blog detassigny.net</source><pubDate>Sun, 02 Dec 2018 00:00:00 +0000</pubDate><guid isPermaLink="true">https://blog.detassigny.net/going-frameworkless/</guid></item><item><title>Design Pattern #1: Value Object</title><author>Gabriel de Tassigny</author><description>&lt;h1 id=&quot;design-pattern-1-value-object&quot;&gt;Design Pattern #1: Value Object&lt;/h1&gt;
&lt;p&gt;Learn how and why to use this simple yet very effective design pattern!&lt;/p&gt;
&lt;!-- more --&gt;

&lt;p&gt;I named this article &quot;&lt;em&gt;Design Pattern #1&lt;/em&gt;&quot; because I think it would be cool to write more of these in the future, but only time will tell if I actually commit to it...&lt;/p&gt;
&lt;p&gt;In this article I will try to explain how the value object design pattern works and more importantly how you can use it!&lt;/p&gt;
&lt;p&gt;First of all, I think this is a very nice pattern because it&apos;s equally simple to use and can be very powerful in keeping your code clean.&lt;/p&gt;
&lt;h2 id=&quot;why-do-i-need-this&quot;&gt;Why do I need this?&lt;/h2&gt;
&lt;p&gt;I don&apos;t know about you, but one thing that annoys me about some design patterns is that you&apos;re never sure if you can actually use them in your day to day programming life! What&apos;s the point of learning them if you don&apos;t use them in the end?&lt;/p&gt;
&lt;p&gt;Well, the good thing is that the value object design pattern is very easy to use and can be used in many situations!&lt;/p&gt;
&lt;p&gt;Let&apos;s start with an example: Let&apos;s say your program contains an email address. You may want to make sure in various part of your system that a specific variable is actually an email address. You&apos;ll then have one of this at multiple places in your code :&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-0-1&quot; name=&quot;__codelineno-0-1&quot; href=&quot;#__codelineno-0-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;filter_var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$email&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;FILTER_VALIDATE_EMAIL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-2&quot; name=&quot;__codelineno-0-2&quot; href=&quot;#__codelineno-0-2&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Exception&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;Houston we have a problem!&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-0-3&quot; name=&quot;__codelineno-0-3&quot; href=&quot;#__codelineno-0-3&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And that will work, but having it everywhere is a bit... annoying, no?&lt;/p&gt;
&lt;p&gt;Now you may tell me &quot;but I can put that in a function somewhere and call it everywhere I want!&quot;.&lt;/p&gt;
&lt;p&gt;Sure, that will work, you could do this :&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-1-1&quot; name=&quot;__codelineno-1-1&quot; href=&quot;#__codelineno-1-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ensureIsEmail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$email&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-2&quot; name=&quot;__codelineno-1-2&quot; href=&quot;#__codelineno-1-2&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-3&quot; name=&quot;__codelineno-1-3&quot; href=&quot;#__codelineno-1-3&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;filter_var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$email&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;FILTER_VALIDATE_EMAIL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-4&quot; name=&quot;__codelineno-1-4&quot; href=&quot;#__codelineno-1-4&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Exception&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;Invalid email: &apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$email&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-5&quot; name=&quot;__codelineno-1-5&quot; href=&quot;#__codelineno-1-5&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-6&quot; name=&quot;__codelineno-1-6&quot; href=&quot;#__codelineno-1-6&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-7&quot; name=&quot;__codelineno-1-7&quot; href=&quot;#__codelineno-1-7&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-8&quot; name=&quot;__codelineno-1-8&quot; href=&quot;#__codelineno-1-8&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;functionA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$email&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-9&quot; name=&quot;__codelineno-1-9&quot; href=&quot;#__codelineno-1-9&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-10&quot; name=&quot;__codelineno-1-10&quot; href=&quot;#__codelineno-1-10&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;nx&quot;&gt;ensureIsEmail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$email&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-11&quot; name=&quot;__codelineno-1-11&quot; href=&quot;#__codelineno-1-11&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;nx&quot;&gt;functionB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$email&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-12&quot; name=&quot;__codelineno-1-12&quot; href=&quot;#__codelineno-1-12&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-13&quot; name=&quot;__codelineno-1-13&quot; href=&quot;#__codelineno-1-13&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-14&quot; name=&quot;__codelineno-1-14&quot; href=&quot;#__codelineno-1-14&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;functionB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$email&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-15&quot; name=&quot;__codelineno-1-15&quot; href=&quot;#__codelineno-1-15&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-16&quot; name=&quot;__codelineno-1-16&quot; href=&quot;#__codelineno-1-16&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;nx&quot;&gt;ensureIsEmail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$email&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-17&quot; name=&quot;__codelineno-1-17&quot; href=&quot;#__codelineno-1-17&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;c1&quot;&gt;// Do something else with $email&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-18&quot; name=&quot;__codelineno-1-18&quot; href=&quot;#__codelineno-1-18&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-19&quot; name=&quot;__codelineno-1-19&quot; href=&quot;#__codelineno-1-19&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-1-20&quot; name=&quot;__codelineno-1-20&quot; href=&quot;#__codelineno-1-20&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;filter_var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$email&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;FILTER_VALIDATE_EMAIL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-21&quot; name=&quot;__codelineno-1-21&quot; href=&quot;#__codelineno-1-21&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;nx&quot;&gt;functionA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$email&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-1-22&quot; name=&quot;__codelineno-1-22&quot; href=&quot;#__codelineno-1-22&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;See the problem? Everywhere you passes &lt;em&gt;$email&lt;/em&gt;, you need to make sure it&apos;s still a valid email. Or you could try to remember if it&apos;s been checked before depending on context, but that could become very painful to track in a large system...&lt;/p&gt;
&lt;p&gt;But what if instead you had a specific class that encapsulated your $email value? What if the value being in that class meant it was already validated?&lt;/p&gt;
&lt;p&gt;You know where I&apos;m going with this, value object is the answer! If you had such a class, you could do this:&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-2-1&quot; name=&quot;__codelineno-2-1&quot; href=&quot;#__codelineno-2-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;functionA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;EmailAddress&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$email&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-2&quot; name=&quot;__codelineno-2-2&quot; href=&quot;#__codelineno-2-2&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-3&quot; name=&quot;__codelineno-2-3&quot; href=&quot;#__codelineno-2-3&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;nx&quot;&gt;functionB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$email&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-4&quot; name=&quot;__codelineno-2-4&quot; href=&quot;#__codelineno-2-4&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-5&quot; name=&quot;__codelineno-2-5&quot; href=&quot;#__codelineno-2-5&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-6&quot; name=&quot;__codelineno-2-6&quot; href=&quot;#__codelineno-2-6&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;functionB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;EmailAddress&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$email&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-7&quot; name=&quot;__codelineno-2-7&quot; href=&quot;#__codelineno-2-7&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-8&quot; name=&quot;__codelineno-2-8&quot; href=&quot;#__codelineno-2-8&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;c1&quot;&gt;// Do something else with $email&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-9&quot; name=&quot;__codelineno-2-9&quot; href=&quot;#__codelineno-2-9&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-10&quot; name=&quot;__codelineno-2-10&quot; href=&quot;#__codelineno-2-10&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-11&quot; name=&quot;__codelineno-2-11&quot; href=&quot;#__codelineno-2-11&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-12&quot; name=&quot;__codelineno-2-12&quot; href=&quot;#__codelineno-2-12&quot;&gt;&lt;/a&gt;  &lt;span class=&quot;nv&quot;&gt;$email&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;EmailAddress&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;myemail@example.com&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-13&quot; name=&quot;__codelineno-2-13&quot; href=&quot;#__codelineno-2-13&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-14&quot; name=&quot;__codelineno-2-14&quot; href=&quot;#__codelineno-2-14&quot;&gt;&lt;/a&gt;  &lt;span class=&quot;c1&quot;&gt;// Handle error here&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-15&quot; name=&quot;__codelineno-2-15&quot; href=&quot;#__codelineno-2-15&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-2-16&quot; name=&quot;__codelineno-2-16&quot; href=&quot;#__codelineno-2-16&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-2-17&quot; name=&quot;__codelineno-2-17&quot; href=&quot;#__codelineno-2-17&quot;&gt;&lt;/a&gt;&lt;span class=&quot;nx&quot;&gt;functionA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$email&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;No more checking that the email address is valid! ...Well, not exactly, you still need to do it the first time you instantiate the value object, which means we&apos;ll check the value of the variable in the constructor. Let&apos;s go over that now.&lt;/p&gt;
&lt;h2 id=&quot;how-can-i-write-a-value-object-class&quot;&gt;How can I write a value object class?&lt;/h2&gt;
&lt;p&gt;The rules of a value object are simple :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;all verification is done in the constructor&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;if the value passed in the constructor is not valid, throw an exception&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;the value object is immutable (otherwise we could change the value to a non valid one, and that would defeat its purpose)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;there should be a getter of some sort to access the value&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is how our email address could look like :&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-3-1&quot; name=&quot;__codelineno-3-1&quot; href=&quot;#__codelineno-3-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;EmailAddress&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-2&quot; name=&quot;__codelineno-3-2&quot; href=&quot;#__codelineno-3-2&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-3&quot; name=&quot;__codelineno-3-3&quot; href=&quot;#__codelineno-3-3&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-4&quot; name=&quot;__codelineno-3-4&quot; href=&quot;#__codelineno-3-4&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-3-5&quot; name=&quot;__codelineno-3-5&quot; href=&quot;#__codelineno-3-5&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;fm&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-6&quot; name=&quot;__codelineno-3-6&quot; href=&quot;#__codelineno-3-6&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-7&quot; name=&quot;__codelineno-3-7&quot; href=&quot;#__codelineno-3-7&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;filter_var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;FILTER_VALIDATE_EMAIL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-8&quot; name=&quot;__codelineno-3-8&quot; href=&quot;#__codelineno-3-8&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;InvalidArgumentException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;Invalid email: &apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$email&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-9&quot; name=&quot;__codelineno-3-9&quot; href=&quot;#__codelineno-3-9&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-10&quot; name=&quot;__codelineno-3-10&quot; href=&quot;#__codelineno-3-10&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-11&quot; name=&quot;__codelineno-3-11&quot; href=&quot;#__codelineno-3-11&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-12&quot; name=&quot;__codelineno-3-12&quot; href=&quot;#__codelineno-3-12&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-3-13&quot; name=&quot;__codelineno-3-13&quot; href=&quot;#__codelineno-3-13&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-14&quot; name=&quot;__codelineno-3-14&quot; href=&quot;#__codelineno-3-14&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-15&quot; name=&quot;__codelineno-3-15&quot; href=&quot;#__codelineno-3-15&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-16&quot; name=&quot;__codelineno-3-16&quot; href=&quot;#__codelineno-3-16&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-3-17&quot; name=&quot;__codelineno-3-17&quot; href=&quot;#__codelineno-3-17&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, you can simply instantiate it the first time, catch the exception in case the value isn&apos;t valid, and if it is valid you can pass the object anywhere in your system and expect it to stay valid.&lt;/p&gt;
&lt;h2 id=&quot;how-i-can-use-my-new-shiny-value-object&quot;&gt;How I can use my new shiny value object?&lt;/h2&gt;
&lt;p&gt;Now, let&apos;s have a more practical example on how to use it : Let&apos;s say you have an endpoint that sends a password reset email to a user. It means we&apos;ll have a controller that reads the parameter, and a service that sends the email.&lt;/p&gt;
&lt;p&gt;Obviously I&apos;ll emit a lot of code and leave only the parts that we&apos;re interested in.&lt;/p&gt;
&lt;p&gt;Our controller could look like this :&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-4-1&quot; name=&quot;__codelineno-4-1&quot; href=&quot;#__codelineno-4-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PasswordResetController&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-2&quot; name=&quot;__codelineno-4-2&quot; href=&quot;#__codelineno-4-2&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-3&quot; name=&quot;__codelineno-4-3&quot; href=&quot;#__codelineno-4-3&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-4&quot; name=&quot;__codelineno-4-4&quot; href=&quot;#__codelineno-4-4&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-4-5&quot; name=&quot;__codelineno-4-5&quot; href=&quot;#__codelineno-4-5&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;fm&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;PasswordResetService&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-6&quot; name=&quot;__codelineno-4-6&quot; href=&quot;#__codelineno-4-6&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-7&quot; name=&quot;__codelineno-4-7&quot; href=&quot;#__codelineno-4-7&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;service&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-8&quot; name=&quot;__codelineno-4-8&quot; href=&quot;#__codelineno-4-8&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-9&quot; name=&quot;__codelineno-4-9&quot; href=&quot;#__codelineno-4-9&quot;&gt;&lt;/a&gt;
&lt;a id=&quot;__codelineno-4-10&quot; name=&quot;__codelineno-4-10&quot; href=&quot;#__codelineno-4-10&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;sendPasswordResetEmail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$emailParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-11&quot; name=&quot;__codelineno-4-11&quot; href=&quot;#__codelineno-4-11&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-12&quot; name=&quot;__codelineno-4-12&quot; href=&quot;#__codelineno-4-12&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-13&quot; name=&quot;__codelineno-4-13&quot; href=&quot;#__codelineno-4-13&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;nv&quot;&gt;$emailAddress&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;EmailAddress&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$emailParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-14&quot; name=&quot;__codelineno-4-14&quot; href=&quot;#__codelineno-4-14&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;InvalidArgumentException&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-15&quot; name=&quot;__codelineno-4-15&quot; href=&quot;#__codelineno-4-15&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;c1&quot;&gt;// Handle error somehow (display an error page, throw an exception...)&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-16&quot; name=&quot;__codelineno-4-16&quot; href=&quot;#__codelineno-4-16&quot;&gt;&lt;/a&gt;            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Exception&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;Invalid parameter &apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$emailParam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-17&quot; name=&quot;__codelineno-4-17&quot; href=&quot;#__codelineno-4-17&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-18&quot; name=&quot;__codelineno-4-18&quot; href=&quot;#__codelineno-4-18&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;sendEmail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$emailAddress&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-19&quot; name=&quot;__codelineno-4-19&quot; href=&quot;#__codelineno-4-19&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-4-20&quot; name=&quot;__codelineno-4-20&quot; href=&quot;#__codelineno-4-20&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can use the EmailAddress value object to verify the formatting of the parameter. Once it is done, we know the rest of the code will have a correctly formatted email address.&lt;/p&gt;
&lt;p&gt;In case the email is not valid, we can handle the exception on the controller level and deal with it accordingly.&lt;/p&gt;
&lt;p&gt;Now let&apos;s have a look at the service called by the controller :&lt;/p&gt;
&lt;div class=&quot;language-php highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;a id=&quot;__codelineno-5-1&quot; name=&quot;__codelineno-5-1&quot; href=&quot;#__codelineno-5-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PasswordResetService&lt;/span&gt;
&lt;a id=&quot;__codelineno-5-2&quot; name=&quot;__codelineno-5-2&quot; href=&quot;#__codelineno-5-2&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-5-3&quot; name=&quot;__codelineno-5-3&quot; href=&quot;#__codelineno-5-3&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;sendEmail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;EmailAddress&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$emailAddress&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;a id=&quot;__codelineno-5-4&quot; name=&quot;__codelineno-5-4&quot; href=&quot;#__codelineno-5-4&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;a id=&quot;__codelineno-5-5&quot; name=&quot;__codelineno-5-5&quot; href=&quot;#__codelineno-5-5&quot;&gt;&lt;/a&gt;        &lt;span class=&quot;nb&quot;&gt;mail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$emailAddress&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;Password reset&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;Your link to your new password is...&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;a id=&quot;__codelineno-5-6&quot; name=&quot;__codelineno-5-6&quot; href=&quot;#__codelineno-5-6&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;a id=&quot;__codelineno-5-7&quot; name=&quot;__codelineno-5-7&quot; href=&quot;#__codelineno-5-7&quot;&gt;&lt;/a&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is obviously an overly simple service but you get the idea : the service expects a value object and therefore doesn&apos;t need to validate its format. It can then call the &lt;strong&gt;getValue&lt;/strong&gt; method to retrieve its value.&lt;/p&gt;</description><link>https://blog.detassigny.net/design-pattern-1-value-object/</link><source url="https://blog.detassigny.net/feed_rss_created.xml">$&gt; blog detassigny.net</source><pubDate>Thu, 29 Nov 2018 00:00:00 +0000</pubDate><guid isPermaLink="true">https://blog.detassigny.net/design-pattern-1-value-object/</guid></item></channel></rss>