{"id":31469,"date":"2025-10-10T08:41:49","date_gmt":"2025-10-10T05:41:49","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31469"},"modified":"2025-10-10T08:41:49","modified_gmt":"2025-10-10T05:41:49","slug":"junit5-tutorial-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/","title":{"rendered":"JUnit5 Tutorial: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>JUnit5 Tutorial: Kapsaml\u0131 Bir Rehber<\/h2>\n<p>Yaz\u0131l\u0131m geli\u015ftirme s\u00fcrecinde kalitenin ve g\u00fcvenilirli\u011fin sa\u011flanmas\u0131, modern uygulamalar\u0131n vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r. Bu ba\u011flamda, birim testleri (unit tests) yaz\u0131l\u0131m\u0131n temel yap\u0131 ta\u015flar\u0131n\u0131n do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olman\u0131n en etkili yollar\u0131ndan biridir. Java ekosisteminde birim testleri i\u00e7in en yayg\u0131n ve g\u00fc\u00e7l\u00fc ara\u00e7lardan biri de \u015f\u00fcphesiz JUnit&#8217;tir. Bu rehberde, JUnit&#8217;in en g\u00fcncel s\u00fcr\u00fcm\u00fc olan JUnit5&#8217;i (resmi ad\u0131yla JUnit Jupiter) t\u00fcm detaylar\u0131yla inceleyecek, temelden ileri seviyeye kadar \u00f6zelliklerini kod \u00f6rnekleriyle a\u00e7\u0131klayaca\u011f\u0131z.<\/p>\n<p>JUnit5, \u00f6nceki s\u00fcr\u00fcmlerine g\u00f6re daha mod\u00fcler, esnek ve g\u00fc\u00e7l\u00fc bir yap\u0131 sunar. Geli\u015ftiricilere test yazma ve \u00e7al\u0131\u015ft\u0131rma konusunda daha fazla kontrol ve olanak tan\u0131r. Uygulamalar\u0131n\u0131z\u0131n kalitesini art\u0131rmak, hatalar\u0131 erken a\u015famada tespit etmek ve kodunuzun s\u00fcrd\u00fcr\u00fclebilirli\u011fini sa\u011flamak i\u00e7in JUnit5&#8217;i etkin bir \u015fekilde kullanmak kritik \u00f6neme sahiptir.<\/p>\n<h3>JUnit5 Kurulumu ve Proje Yap\u0131land\u0131rmas\u0131<\/h3>\n<p>JUnit5, mod\u00fcler yap\u0131s\u0131 sayesinde farkl\u0131 bile\u015fenlerden olu\u015fur: Jupiter (test API&#8217;si ve test motoru), Vintage (JUnit3 ve JUnit4 testlerini \u00e7al\u0131\u015ft\u0131rma motoru) ve Platform (test motorlar\u0131n\u0131n \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131 temel API). Modern bir Java projesinde JUnit5&#8217;i kullanmaya ba\u015flamak i\u00e7in proje ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 eklemeniz gerekir. En yayg\u0131n kullan\u0131lan build ara\u00e7lar\u0131 Maven ve Gradle i\u00e7in \u00f6rnek yap\u0131land\u0131rmalar\u0131 a\u015fa\u011f\u0131da bulabilirsiniz.<\/p>\n<h4>Maven Projeleri \u0130\u00e7in (pom.xml)<\/h4>\n<p>Maven projenizde JUnit5 kullanmak i\u00e7in <code>pom.xml<\/code> dosyan\u0131za a\u015fa\u011f\u0131daki ba\u011f\u0131ml\u0131l\u0131klar\u0131 ekleyin. Genellikle sadece <code>junit-jupiter-api<\/code> ve <code>junit-jupiter-engine<\/code> yeterli olacakt\u0131r. Testlerinizi \u00e7al\u0131\u015ft\u0131rabilmek i\u00e7in Maven Surefire Plugin&#8217;in de do\u011fru yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131ndan emin olun.<\/p>\n<pre><code class=\"language-xml\"><dependencies>\n    <!-- JUnit Jupiter API & TestEngine -->\n    <dependency>\n        <groupId>org.junit.jupiter<\/groupId>\n        <artifactId>junit-jupiter-api<\/artifactId>\n        <version>5.10.0<\/version&gt; <!-- G\u00fcncel s\u00fcr\u00fcm\u00fc kontrol edin -->\n        <scope>test<\/scope>\n    <\/dependency>\n    <dependency>\n        <groupId>org.junit.jupiter<\/groupId>\n        <artifactId>junit-jupiter-engine<\/artifactId>\n        <version>5.10.0<\/version&gt; <!-- G\u00fcncel s\u00fcr\u00fcm\u00fc kontrol edin -->\n        <scope>test<\/scope>\n    <\/dependency>\n<\/dependencies>\n\n<build>\n    <plugins>\n        <plugin>\n            <groupId>org.apache.maven.plugins<\/groupId>\n            <artifactId>maven-surefire-plugin<\/artifactId>\n            <version>3.2.3<\/version&gt; <!-- G\u00fcncel s\u00fcr\u00fcm\u00fc kontrol edin -->\n            <configuration>\n                <maven.compiler.source>17<\/maven.compiler.source> <!-- Java s\u00fcr\u00fcm\u00fcn\u00fcz -->\n                <maven.compiler.target>17<\/maven.compiler.target> <!-- Java s\u00fcr\u00fcm\u00fcn\u00fcz -->\n            <\/configuration>\n        <\/plugin>\n    <\/plugins>\n<\/build>\n<\/code><\/pre>\n<h4>Gradle Projeleri \u0130\u00e7in (build.gradle)<\/h4>\n<p>Gradle projenizde ise <code>build.gradle<\/code> dosyan\u0131za a\u015fa\u011f\u0131daki ba\u011f\u0131ml\u0131l\u0131klar\u0131 ekleyin. <code>useJUnitPlatform()<\/code> \u00e7a\u011fr\u0131s\u0131, Gradle&#8217;\u0131n JUnit Platform&#8217;u kullanarak testlerinizi \u00e7al\u0131\u015ft\u0131rmas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-gradle\">plugins {\n    id 'java'\n}\n\nrepositories {\n    mavenCentral()\n}\n\ndependencies {\n    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.0' \/\/ G\u00fcncel s\u00fcr\u00fcm\u00fc kontrol edin\n    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.0' \/\/ G\u00fcncel s\u00fcr\u00fcm\u00fc kontrol edin\n}\n\ntest {\n    useJUnitPlatform()\n}\n<\/code><\/pre>\n<p>Ba\u011f\u0131ml\u0131l\u0131klar\u0131 ekledikten sonra projenizi g\u00fcncelleyin (Maven i\u00e7in <code>mvn clean install<\/code>, Gradle i\u00e7in <code>gradle build<\/code>). Art\u0131k JUnit5 testleri yazmaya haz\u0131rs\u0131n\u0131z.<\/p>\n<h3>Temel JUnit5 Annotasyonlar\u0131 ve Assertions<\/h3>\n<p>JUnit5, test senaryolar\u0131n\u0131z\u0131 tan\u0131mlamak ve y\u00f6netmek i\u00e7in zengin bir annotasyon seti sunar. Ayr\u0131ca, test sonu\u00e7lar\u0131n\u0131 do\u011frulamak i\u00e7in \u00e7e\u015fitli assertion metotlar\u0131 mevcuttur.<\/p>\n<h4>Temel Annotasyonlar<\/h4>\n<ul>\n<li><code>@Test<\/code>: Bir metodun bir test metodu oldu\u011funu belirtir. En temel annotasyondur.<\/li>\n<li><code>@DisplayName(\"A\u00e7\u0131klay\u0131c\u0131 Test Ad\u0131\")<\/code>: Test metodlar\u0131na veya s\u0131n\u0131flar\u0131na okunabilir, a\u00e7\u0131klay\u0131c\u0131 isimler vermenizi sa\u011flar. Test raporlar\u0131nda bu isimler g\u00f6r\u00fcn\u00fcr.<\/li>\n<li><code>@BeforeEach<\/code>: Her test metodundan \u00f6nce \u00e7al\u0131\u015facak kodu tan\u0131mlar. Kaynaklar\u0131 ba\u015flatma veya test ortam\u0131n\u0131 haz\u0131rlama gibi i\u015flemler i\u00e7in idealdir.<\/li>\n<li><code>@AfterEach<\/code>: Her test metodundan sonra \u00e7al\u0131\u015facak kodu tan\u0131mlar. Kaynaklar\u0131 serbest b\u0131rakma veya test ortam\u0131n\u0131 temizleme gibi i\u015flemler i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><code>@BeforeAll<\/code>: Test s\u0131n\u0131f\u0131ndaki t\u00fcm test metotlar\u0131ndan \u00f6nce bir kez \u00e7al\u0131\u015facak kodu tan\u0131mlar. Genellikle pahal\u0131 kaynaklar\u0131 (veritaban\u0131 ba\u011flant\u0131s\u0131 gibi) ba\u015flatmak i\u00e7in kullan\u0131l\u0131r. Bu metodun <code>static<\/code> olmas\u0131 gerekir.<\/li>\n<li><code>@AfterAll<\/code>: Test s\u0131n\u0131f\u0131ndaki t\u00fcm test metotlar\u0131 bittikten sonra bir kez \u00e7al\u0131\u015facak kodu tan\u0131mlar. <code>@BeforeAll<\/code> ile ba\u015flat\u0131lan kaynaklar\u0131 serbest b\u0131rakmak i\u00e7in kullan\u0131l\u0131r. Bu metodun da <code>static<\/code> olmas\u0131 gerekir.<\/li>\n<\/ul>\n<h4>Assertions (Onaylamalar)<\/h4>\n<p>JUnit5&#8217;in <code>org.junit.jupiter.api.Assertions<\/code> s\u0131n\u0131f\u0131, test sonu\u00e7lar\u0131n\u0131 do\u011frulamak i\u00e7in bir dizi statik metot sunar:<\/p>\n<ul>\n<li><code>assertEquals(expected, actual)<\/code>: \u0130ki de\u011ferin e\u015fit olup olmad\u0131\u011f\u0131n\u0131 kontrol eder.<\/li>\n<li><code>assertTrue(condition)<\/code>: Bir ko\u015fulun do\u011fru olup olmad\u0131\u011f\u0131n\u0131 kontrol eder.<\/li>\n<li><code>assertFalse(condition)<\/code>: Bir ko\u015fulun yanl\u0131\u015f olup olmad\u0131\u011f\u0131n\u0131 kontrol eder.<\/li>\n<li><code>assertNull(object)<\/code>: Bir nesnenin null olup olmad\u0131\u011f\u0131n\u0131 kontrol eder.<\/li>\n<li><code>assertNotNull(object)<\/code>: Bir nesnenin null olmad\u0131\u011f\u0131n\u0131 kontrol eder.<\/li>\n<li><code>assertThrows(expectedType, executable)<\/code>: Belirli bir kod blo\u011funun beklenen bir istisnay\u0131 (exception) f\u0131rlat\u0131p f\u0131rlatmad\u0131\u011f\u0131n\u0131 kontrol eder.<\/li>\n<li><code>assertAll(executables...)<\/code>: Birden fazla assertion&#8217;\u0131 ayn\u0131 anda \u00e7al\u0131\u015ft\u0131r\u0131r. E\u011fer bir assertion ba\u015far\u0131s\u0131z olursa di\u011ferleri de \u00e7al\u0131\u015fmaya devam eder ve t\u00fcm ba\u015far\u0131s\u0131zl\u0131klar raporlan\u0131r.<\/li>\n<\/ul>\n<h4>\u00d6rnek Bir Test S\u0131n\u0131f\u0131<\/h4>\n<pre><code class=\"language-java\">import org.junit.jupiter.api.*;\nimport static org.junit.jupiter.api.Assertions.*;\n\nclass HesapMakinesi {\n    public int topla(int a, int b) {\n        return a + b;\n    }\n\n    public int cikar(int a, int b) {\n        return a - b;\n    }\n\n    public int carp(int a, int b) {\n        return a * b;\n    }\n\n    public double bol(int a, int b) {\n        if (b == 0) {\n            throw new IllegalArgumentException(\"S\u0131f\u0131ra b\u00f6lme hatas\u0131!\");\n        }\n        return (double) a \/ b;\n    }\n}\n\n@DisplayName(\"Hesap Makinesi Testleri\")\nclass HesapMakinesiTest {\n\n    private HesapMakinesi hesapMakinesi;\n\n    @BeforeAll\n    static void setupAll() {\n        System.out.println(\"T\u00fcm testler ba\u015flamadan \u00f6nce bir kez \u00e7al\u0131\u015f\u0131r.\");\n        \/\/ \u00d6rne\u011fin, veritaban\u0131 ba\u011flant\u0131s\u0131 burada kurulabilir.\n    }\n\n    @BeforeEach\n    void setup() {\n        System.out.println(\"Her testten \u00f6nce \u00e7al\u0131\u015f\u0131r: HesapMakinesi objesi olu\u015fturuluyor.\");\n        hesapMakinesi = new HesapMakinesi();\n    }\n\n    @Test\n    @DisplayName(\"\u0130ki say\u0131n\u0131n toplam\u0131n\u0131 do\u011fru hesaplamal\u0131\")\n    void testTopla() {\n        assertEquals(5, hesapMakinesi.topla(2, 3), \"Toplama i\u015flemi yanl\u0131\u015f.\");\n    }\n\n    @Test\n    @DisplayName(\"\u0130ki say\u0131n\u0131n fark\u0131n\u0131 do\u011fru hesaplamal\u0131\")\n    void testCikar() {\n        assertEquals(1, hesapMakinesi.cikar(3, 2), () -> \"\u00c7\u0131karma i\u015flemi yanl\u0131\u015f oldu.\"); \/\/ Lambda ile mesaj\n    }\n\n    @Test\n    @DisplayName(\"\u0130ki say\u0131n\u0131n \u00e7arp\u0131m\u0131n\u0131 do\u011fru hesaplamal\u0131\")\n    void testCarp() {\n        assertEquals(6, hesapMakinesi.carp(2, 3));\n    }\n\n    @Test\n    @DisplayName(\"S\u0131f\u0131ra b\u00f6lme durumunda hata f\u0131rlatmal\u0131\")\n    void testBolmeSifiraHata() {\n        Exception exception = assertThrows(IllegalArgumentException.class, () ->\n            hesapMakinesi.bol(10, 0));\n        assertEquals(\"S\u0131f\u0131ra b\u00f6lme hatas\u0131!\", exception.getMessage());\n    }\n\n    @Test\n    @DisplayName(\"Birden fazla assertion'\u0131 ayn\u0131 anda kontrol etmeli\")\n    void testCokluAssertion() {\n        \/\/ T\u00fcm assertion'lar \u00e7al\u0131\u015f\u0131r ve ba\u015far\u0131s\u0131z olanlar\u0131n hepsi raporlan\u0131r.\n        assertAll(\"Hesap Makinesi Temel \u0130\u015flemleri\",\n            () -> assertEquals(5, hesapMakinesi.topla(2, 3)),\n            () -> assertEquals(1, hesapMakinesi.cikar(3, 2)),\n            () -> assertEquals(6, hesapMakinesi.carp(2, 3))\n        );\n    }\n\n    @AfterEach\n    void teardown() {\n        System.out.println(\"Her testten sonra \u00e7al\u0131\u015f\u0131r: HesapMakinesi objesi temizlendi.\");\n        hesapMakinesi = null; \/\/ Bellek y\u00f6netimi i\u00e7in null'a atama\n    }\n\n    @AfterAll\n    static void teardownAll() {\n        System.out.println(\"T\u00fcm testler bittikten sonra bir kez \u00e7al\u0131\u015f\u0131r.\");\n        \/\/ \u00d6rne\u011fin, veritaban\u0131 ba\u011flant\u0131s\u0131 burada kapat\u0131labilir.\n    }\n}\n<\/code><\/pre>\n<h3>Geli\u015fmi\u015f JUnit5 \u00d6zellikleri<\/h3>\n<p>JUnit5, daha karma\u015f\u0131k test senaryolar\u0131n\u0131 ele almak i\u00e7in bir dizi geli\u015fmi\u015f \u00f6zellik sunar. Bu \u00f6zellikler, test kodunuzu daha okunabilir, s\u00fcrd\u00fcr\u00fclebilir ve esnek hale getirmenize yard\u0131mc\u0131 olur.<\/p>\n<h4>H3.1. Parametreli Testler (@ParameterizedTest)<\/h4>\n<p>Ayn\u0131 test mant\u0131\u011f\u0131n\u0131 farkl\u0131 veri setleriyle tekrar tekrar \u00e7al\u0131\u015ft\u0131rmak istedi\u011finizde parametreli testler \u00e7ok kullan\u0131\u015fl\u0131d\u0131r. Bu, test kodunuzdaki tekrar\u0131 azalt\u0131r ve daha kapsaml\u0131 testler yazman\u0131z\u0131 sa\u011flar.<\/p>\n<ul>\n<li><code>@ParameterizedTest<\/code>: Bir metodun parametreli test oldu\u011funu belirtir.<\/li>\n<li><code>@ValueSource<\/code>: Primitif de\u011ferler (String, int, long, double vb.) i\u00e7in tek bir arg\u00fcman kayna\u011f\u0131 sa\u011flar.<\/li>\n<li><code>@CsvSource<\/code>: CSV (Comma Separated Values) format\u0131nda birden fazla arg\u00fcman kayna\u011f\u0131 sa\u011flar.<\/li>\n<li><code>@MethodSource<\/code>: Bir metodun d\u00f6nd\u00fcrd\u00fc\u011f\u00fc Stream veya Collection t\u00fcr\u00fcndeki arg\u00fcmanlar\u0131 kullan\u0131r.<\/li>\n<\/ul>\n<pre><code class=\"language-java\">import org.junit.jupiter.api.DisplayName;\nimport org.junit.jupiter.params.ParameterizedTest;\nimport org.junit.jupiter.params.provider.CsvSource;\nimport org.junit.jupiter.params.provider.ValueSource;\n\nimport static org.junit.jupiter.api.Assertions.assertTrue;\nimport static org.junit.jupiter.api.Assertions.assertEquals;\n\nclass StringUtils {\n    public boolean isPalindrom(String text) {\n        String cleanText = text.replaceAll(\"\\\\s+\", \"\").toLowerCase();\n        return new StringBuilder(cleanText).reverse().toString().equals(cleanText);\n    }\n\n    public String buyukHarfYap(String text) {\n        return text.toUpperCase();\n    }\n}\n\n@DisplayName(\"StringUtils Testleri\")\nclass StringUtilsTest {\n\n    private StringUtils stringUtils = new StringUtils();\n\n    @ParameterizedTest\n    @ValueSource(strings = {\"madam\", \"kayak\", \"level\", \"radar\"})\n    @DisplayName(\"Palindrom testleri - ValueSource\")\n    void testIsPalindrom(String adayKelime) {\n        assertTrue(stringUtils.isPalindrom(adayKelime), adayKelime + \" bir palindrom olmal\u0131yd\u0131.\");\n    }\n\n    @ParameterizedTest\n    @CsvSource({\n        \"hello, HELLO\",\n        \"world, WORLD\",\n        \"java, JAVA\"\n    })\n    @DisplayName(\"B\u00fcy\u00fck harf d\u00f6n\u00fc\u015ft\u00fcrme testleri - CsvSource\")\n    void testBuyukHarfYap(String girdi, String beklenenCikti) {\n        assertEquals(beklenenCikti, stringUtils.buyukHarfYap(girdi));\n    }\n}\n<\/code><\/pre>\n<h4>H3.2. Tekrarlanan Testler (@RepeatedTest)<\/h4>\n<p>Bir testi belirli bir say\u0131da tekrarlamak istedi\u011finizde <code>@RepeatedTest<\/code> annotasyonunu kullanabilirsiniz. Bu, \u00f6zellikle rastgele de\u011ferler i\u00e7eren veya zamanlama hassasiyeti olan testler i\u00e7in faydal\u0131 olabilir.<\/p>\n<pre><code class=\"language-java\">import org.junit.jupiter.api.DisplayName;\nimport org.junit.jupiter.api.RepeatedTest;\nimport org.junit.jupiter.api.RepetitionInfo;\n\nimport static org.junit.jupiter.api.Assertions.assertTrue;\n\n@DisplayName(\"Tekrarlanan Test \u00d6rne\u011fi\")\nclass RepeatedTestExample {\n\n    @RepeatedTest(value = 5, name = \"{displayName} - Tekrar {currentRepetition}\/{totalRepetitions}\")\n    @DisplayName(\"Rastgele Say\u0131 Testi\")\n    void testRastgeleSayi(RepetitionInfo repetitionInfo) {\n        System.out.println(\"Test \" + repetitionInfo.getCurrentRepetition() + \". kez \u00e7al\u0131\u015f\u0131yor.\");\n        double randomValue = Math.random();\n        assertTrue(randomValue >= 0 && randomValue < 1, \"Rastgele say\u0131 0 ile 1 aras\u0131nda olmal\u0131.\");\n    }\n}\n<\/code><\/pre>\n<h4>H3.3. Ko\u015fullu Test Y\u00fcr\u00fctme (@EnabledOnOs, @DisabledOnJre vb.)<\/h4>\n<p>Testlerin belirli ko\u015fullara ba\u011fl\u0131 olarak \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 veya atlanmas\u0131n\u0131 sa\u011flayabilirsiniz. Bu, farkl\u0131 i\u015fletim sistemleri, Java s\u00fcr\u00fcmleri veya sistem \u00f6zellikleri i\u00e7in \u00f6zelle\u015ftirilmi\u015f testler yazarken faydal\u0131d\u0131r.<\/p>\n<ul>\n<li><code>@EnabledOnOs({OS.LINUX, OS.MAC})<\/code>: Sadece belirtilen i\u015fletim sistemlerinde \u00e7al\u0131\u015f\u0131r.<\/li>\n<li><code>@DisabledOnOs(OS.WINDOWS)<\/code>: Belirtilen i\u015fletim sisteminde \u00e7al\u0131\u015fmaz.<\/li>\n<li><code>@EnabledOnJre(JRE.JAVA_11)<\/code>: Sadece belirtilen Java Runtime Environment (JRE) s\u00fcr\u00fcm\u00fcnde \u00e7al\u0131\u015f\u0131r.<\/li>\n<li><code>@DisabledOnJre(JRE.JAVA_8)<\/code>: Belirtilen JRE s\u00fcr\u00fcm\u00fcnde \u00e7al\u0131\u015fmaz.<\/li>\n<li><code>@EnabledIfSystemProperty(named = \"os.arch\", matches = \"aarch64\")<\/code>: Belirli bir sistem \u00f6zelli\u011finin de\u011ferine g\u00f6re etkinle\u015ftirir.<\/li>\n<li><code>@DisabledIfEnvironmentVariable(named = \"ENV\", matches = \"prod\")<\/code>: Belirli bir ortam de\u011fi\u015fkeninin de\u011ferine g\u00f6re devre d\u0131\u015f\u0131 b\u0131rak\u0131r.<\/li>\n<\/ul>\n<pre><code class=\"language-java\">import org.junit.jupiter.api.Test;\nimport org.junit.jupiter.api.condition.DisabledOnOs;\nimport org.junit.jupiter.api.condition.EnabledOnOs;\nimport org.junit.jupiter.api.condition.OS;\nimport org.junit.jupiter.api.condition.JRE;\nimport org.junit.jupiter.api.condition.EnabledOnJre;\n\nimport static org.junit.jupiter.api.Assertions.assertTrue;\n\nclass ConditionalTestExample {\n\n    @Test\n    @EnabledOnOs(OS.LINUX)\n    void onlyOnLinux() {\n        System.out.println(\"Bu test sadece Linux'ta \u00e7al\u0131\u015f\u0131r.\");\n        assertTrue(true);\n    }\n\n    @Test\n    @DisabledOnOs(OS.WINDOWS)\n    void notOnWindows() {\n        System.out.println(\"Bu test Windows'ta \u00e7al\u0131\u015fmaz.\");\n        assertTrue(true);\n    }\n\n    @Test\n    @EnabledOnJre(JRE.JAVA_17)\n    void onlyOnJava17() {\n        System.out.println(\"Bu test sadece Java 17'de \u00e7al\u0131\u015f\u0131r.\");\n        assertTrue(true);\n    }\n}\n<\/code><\/pre>\n<h4>H3.4. \u0130\u00e7 \u0130\u00e7e Testler (@Nested)<\/h4>\n<p><code>@Nested<\/code> annotasyonu, test s\u0131n\u0131flar\u0131n\u0131 hiyerar\u015fik bir \u015fekilde organize etmenizi sa\u011flar. Bu, belirli bir senaryonun alt senaryolar\u0131n\u0131 gruplamak i\u00e7in idealdir ve test raporlar\u0131n\u0131n daha okunabilir olmas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<pre><code class=\"language-java\">import org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.DisplayName;\nimport org.junit.jupiter.api.Nested;\nimport org.junit.jupiter.api.Test;\nimport static org.junit.jupiter.api.Assertions.assertEquals;\nimport static org.junit.jupiter.api.Assertions.assertThrows;\n\nclass BankaHesabi {\n    private double bakiye;\n\n    public BankaHesabi(double bakiye) {\n        this.bakiye = bakiye;\n    }\n\n    public void paraYatir(double miktar) {\n        if (miktar <= 0) {\n            throw new IllegalArgumentException(\"Yat\u0131r\u0131lacak miktar pozitif olmal\u0131.\");\n        }\n        this.bakiye += miktar;\n    }\n\n    public void paraCek(double miktar) {\n        if (miktar <= 0) {\n            throw new IllegalArgumentException(\"\u00c7ekilecek miktar pozitif olmal\u0131.\");\n        }\n        if (this.bakiye < miktar) {\n            throw new IllegalArgumentException(\"Yetersiz bakiye.\");\n        }\n        this.bakiye -= miktar;\n    }\n\n    public double getBakiye() {\n        return bakiye;\n    }\n}\n\n@DisplayName(\"Banka Hesab\u0131 Testleri\")\nclass BankaHesabiTest {\n\n    BankaHesabi hesap;\n\n    @BeforeEach\n    void setup() {\n        hesap = new BankaHesabi(1000);\n    }\n\n    @Test\n    @DisplayName(\"Ba\u015flang\u0131\u00e7 bakiyesi do\u011fru olmal\u0131\")\n    void testBaslangicBakiyesi() {\n        assertEquals(1000, hesap.getBakiye());\n    }\n\n    @Nested\n    @DisplayName(\"Para Yat\u0131rma \u0130\u015flemleri\")\n    class ParaYatirmaTestleri {\n\n        @Test\n        @DisplayName(\"Ge\u00e7erli miktar yat\u0131r\u0131ld\u0131\u011f\u0131nda bakiye artmal\u0131\")\n        void testParaYatirGecerliMiktar() {\n            hesap.paraYatir(200);\n            assertEquals(1200, hesap.getBakiye());\n        }\n\n        @Test\n        @DisplayName(\"Negatif miktar yat\u0131r\u0131ld\u0131\u011f\u0131nda hata f\u0131rlatmal\u0131\")\n        void testParaYatirNegatifMiktar() {\n            assertThrows(IllegalArgumentException.class, () -> hesap.paraYatir(-50));\n            assertEquals(1000, hesap.getBakiye(), \"Hata durumunda bakiye de\u011fi\u015fmemeli\");\n        }\n    }\n\n    @Nested\n    @DisplayName(\"Para \u00c7ekme \u0130\u015flemleri\")\n    class ParaCekmeTestleri {\n\n        @Test\n        @DisplayName(\"Ge\u00e7erli miktar \u00e7ekildi\u011finde bakiye azalmal\u0131\")\n        void testParaCekGecerliMiktar() {\n            hesap.paraCek(300);\n            assertEquals(700, hesap.getBakiye());\n        }\n\n        @Test\n        @DisplayName(\"Yetersiz bakiye durumunda hata f\u0131rlatmal\u0131\")\n        void testParaCekYetersizBakiye() {\n            assertThrows(IllegalArgumentException.class, () -> hesap.paraCek(1500));\n            assertEquals(1000, hesap.getBakiye(), \"Hata durumunda bakiye de\u011fi\u015fmemeli\");\n        }\n    }\n}\n<\/code><\/pre>\n<h3>Pratik \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar<\/h3>\n<p>Etkili ve s\u00fcrd\u00fcr\u00fclebilir birim testleri yazmak i\u00e7in baz\u0131 en iyi uygulamalar\u0131 takip etmek \u00f6nemlidir:<\/p>\n<ul>\n<li><strong>AAA Prensibi (Arrange-Act-Assert):<\/strong> Test metotlar\u0131n\u0131z\u0131 bu \u00fc\u00e7 b\u00f6l\u00fcme ay\u0131r\u0131n:\n<ol>\n<li><strong>Arrange (Haz\u0131rl\u0131k):<\/strong> Test edilecek nesneleri ve verileri haz\u0131rlay\u0131n.<\/li>\n<li><strong>Act (Eylem):<\/strong> Test edilen metodu \u00e7a\u011f\u0131r\u0131n.<\/li>\n<li><strong>Assert (Onaylama):<\/strong> Metodun beklenen \u00e7\u0131kt\u0131y\u0131 veya davran\u0131\u015f\u0131 sergiledi\u011fini do\u011frulay\u0131n.<\/li>\n<\/ol>\n<\/li>\n<li><strong>Testlerin Ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131:<\/strong> Her test metodu birbirinden ba\u011f\u0131ms\u0131z olmal\u0131 ve \u00e7al\u0131\u015fma s\u0131ras\u0131 di\u011fer testleri etkilememelidir. <code>@BeforeEach<\/code> ve <code>@AfterEach<\/code> bu ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131 sa\u011flamak i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><strong>Okunabilir Test \u0130simleri:<\/strong> <code>@DisplayName<\/code> kullanarak testlerin neyi test etti\u011fini a\u00e7\u0131k\u00e7a belirten isimler verin. Metot isimleri de a\u00e7\u0131klay\u0131c\u0131 olmal\u0131d\u0131r (\u00f6rne\u011fin, <code>shouldReturnCorrectSumWhenTwoPositiveNumbersAreAdded()<\/code>).<\/li>\n<li><strong>Tek Sorumluluk Prensibi:<\/strong> Her test metodu tek bir \u015feyi test etmelidir. Karma\u015f\u0131k senaryolar\u0131 birden fazla k\u00fc\u00e7\u00fck teste b\u00f6l\u00fcn.<\/li>\n<li><strong>H\u0131zl\u0131 Testler:<\/strong> Birim testleri h\u0131zl\u0131 \u00e7al\u0131\u015fmal\u0131d\u0131r. Harici ba\u011f\u0131ml\u0131l\u0131klar\u0131 (veritaban\u0131, a\u011f \u00e7a\u011fr\u0131lar\u0131 vb.) i\u00e7eren testler entegrasyon testleri olarak s\u0131n\u0131fland\u0131r\u0131lmal\u0131 ve ayr\u0131lmal\u0131d\u0131r. Birim testlerinde bu t\u00fcr ba\u011f\u0131ml\u0131l\u0131klar\u0131 Mocking (Mockito gibi k\u00fct\u00fcphanelerle) kullanarak sim\u00fcle edin.<\/li>\n<li><strong>Do Not Test Private Methods (\u00d6zel Metotlar\u0131 Test Etmeyin):<\/strong> Genellikle \u00f6zel metotlar\u0131 do\u011frudan test etmek yerine, bu metotlar\u0131 kullanan public metotlar\u0131 test edin. E\u011fer \u00f6zel bir metot \u00e7ok karma\u015f\u0131ksa ve ayr\u0131 test gerektiriyorsa, bu, metodun sorumlulu\u011funun \u00e7ok fazla oldu\u011funu ve refactor edilmesi gerekti\u011fini g\u00f6sterebilir.<\/li>\n<li><strong>Test Kapsam\u0131 (Code Coverage):<\/strong> Testlerinizin kodunuzun ne kadar\u0131n\u0131 kapsad\u0131\u011f\u0131n\u0131 \u00f6l\u00e7mek i\u00e7in JaCoCo gibi ara\u00e7lar\u0131 kullan\u0131n. Y\u00fcksek test kapsam\u0131 iyi bir g\u00f6sterge olsa da, testlerin kalitesini garanti etmez. Kapsaml\u0131 ve anlaml\u0131 testler yazmaya odaklan\u0131n.<\/li>\n<\/ul>\n<h3>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p>JUnit5, modern Java uygulamalar\u0131 i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir test \u00e7at\u0131s\u0131 sunar. Mod\u00fcler yap\u0131s\u0131, zengin annotasyon seti ve geli\u015fmi\u015f \u00f6zellikleri sayesinde geli\u015ftiricilerin daha kaliteli, s\u00fcrd\u00fcr\u00fclebilir ve g\u00fcvenilir kod yazmalar\u0131na yard\u0131mc\u0131 olur. Birim testleri, yaz\u0131l\u0131m geli\u015ftirme ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fcn ayr\u0131lmaz bir par\u00e7as\u0131 olmal\u0131 ve s\u00fcrekli olarak g\u00fcncellenmelidir.<\/p>\n<h4>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h4>\n<dl>\n<dt><strong>JUnit 4'ten JUnit 5'e ge\u00e7i\u015f nas\u0131l yap\u0131l\u0131r?<\/strong><\/dt>\n<dd>JUnit 5, geriye d\u00f6n\u00fck uyumlulu\u011fu sa\u011flamak i\u00e7in \"Vintage Engine\" sunar. Bu motoru ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131za ekleyerek JUnit 4 testlerinizi JUnit 5 ortam\u0131nda \u00e7al\u0131\u015ft\u0131rabilirsiniz. Yeni testlerinizi JUnit 5 annotasyonlar\u0131 ile yazmaya ba\u015flayabilir ve mevcut testlerinizi kademeli olarak migrate edebilirsiniz. Temel ge\u00e7i\u015f, <code>org.junit<\/code> yerine <code>org.junit.jupiter.api<\/code> paketlerini kullanmak ve yeni annotasyonlar\u0131 \u00f6\u011frenmektir.<\/dd>\n<dt><strong>Testleri IDE'den (IntelliJ IDEA, Eclipse) nas\u0131l \u00e7al\u0131\u015ft\u0131r\u0131r\u0131m?<\/strong><\/dt>\n<dd>\u00c7o\u011fu modern IDE, JUnit5'i do\u011frudan destekler. Test s\u0131n\u0131f\u0131 veya metot isimlerinin yan\u0131nda genellikle ye\u015fil bir \"oynat\" (run) ikonu bulunur. Bu ikona t\u0131klayarak ilgili testi veya t\u00fcm test s\u0131n\u0131f\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rabilirsiniz. Ayr\u0131ca, projenizin build arac\u0131n\u0131 (Maven\/Gradle) kullanarak da testleri komut sat\u0131r\u0131ndan \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/dd>\n<dt><strong>Parameterized testler neden \u00f6nemlidir?<\/strong><\/dt>\n<dd>Parametreli testler, ayn\u0131 test mant\u0131\u011f\u0131n\u0131 farkl\u0131 girdi de\u011ferleriyle tekrar tekrar \u00e7al\u0131\u015ft\u0131rman\u0131za olanak tan\u0131r. Bu, test kodunuzdaki tekrar\u0131 azalt\u0131r, daha kapsaml\u0131 test senaryolar\u0131 olu\u015fturur ve testlerinizi daha okunabilir hale getirir. \u00d6rne\u011fin, bir metodun farkl\u0131 ge\u00e7erli ve ge\u00e7ersiz girdilerle nas\u0131l davrand\u0131\u011f\u0131n\u0131 tek bir test metoduyla kontrol edebilirsiniz.<\/dd>\n<dt><strong>Testlerde istisna (exception) kontrol\u00fc nas\u0131l yap\u0131l\u0131r?<\/strong><\/dt>\n<dd><code>Assertions.assertThrows(ExpectedExceptionType.class, () -> yourMethodThatThrowsException())<\/code> metodu ile belirli bir kod blo\u011funun beklenen bir istisnay\u0131 f\u0131rlat\u0131p f\u0131rlatmad\u0131\u011f\u0131n\u0131 kontrol edebilirsiniz. Bu metot, f\u0131rlat\u0131lan istisna nesnesini de d\u00f6nd\u00fcrerek istisnan\u0131n mesaj\u0131n\u0131 veya di\u011fer \u00f6zelliklerini kontrol etmenize olanak tan\u0131r.<\/dd>\n<dt><strong>Testleri gruplamak veya filtrelemek i\u00e7in ne kullanmal\u0131y\u0131m?<\/strong><\/dt>\n<dd>JUnit5'te <code>@Tag(\"etiket_adi\")<\/code> annotasyonunu kullanarak testlerinizi etiketleyebilirsiniz. Daha sonra Maven Surefire Plugin veya Gradle'\u0131n test yap\u0131land\u0131rmas\u0131 arac\u0131l\u0131\u011f\u0131yla bu etiketlere g\u00f6re testleri dahil edebilir (<code>includeTags<\/code>) veya hari\u00e7 tutabilirsiniz (<code>excludeTags<\/code>). Bu, sadece belirli bir mod\u00fclle ilgili testleri \u00e7al\u0131\u015ft\u0131rmak istedi\u011finizde veya h\u0131zl\u0131\/yava\u015f testleri ay\u0131rmak istedi\u011finizde \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"JUnit5 Tutorial: Kapsaml\u0131 Bir Rehber\nYaz\u0131l\u0131m geli\u015ftirme s\u00fcrecinde kalitenin ve g\u00fcvenilirli\u011fin sa\u011flanmas\u0131, modern uygulamalar\u0131n vazge\u00e7ilm","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-31469","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>JUnit5 Tutorial: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JUnit5 Tutorial: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"JUnit5 Tutorial: Kapsaml\u0131 Bir Rehber Yaz\u0131l\u0131m geli\u015ftirme s\u00fcrecinde kalitenin ve g\u00fcvenilirli\u011fin sa\u011flanmas\u0131, modern uygulamalar\u0131n vazge\u00e7ilm\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-10T05:41:49+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"JUnit5 Tutorial: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-10-10T05:41:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/\"},\"wordCount\":1710,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/\",\"name\":\"JUnit5 Tutorial: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-10T05:41:49+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JUnit5 Tutorial: Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"JUnit5 Tutorial: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"JUnit5 Tutorial: Kapsaml\u0131 Bir Rehber","og_description":"JUnit5 Tutorial: Kapsaml\u0131 Bir Rehber Yaz\u0131l\u0131m geli\u015ftirme s\u00fcrecinde kalitenin ve g\u00fcvenilirli\u011fin sa\u011flanmas\u0131, modern uygulamalar\u0131n vazge\u00e7ilm","og_url":"https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-10T05:41:49+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"10 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"JUnit5 Tutorial: Kapsaml\u0131 Bir Rehber","datePublished":"2025-10-10T05:41:49+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/"},"wordCount":1710,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/","name":"JUnit5 Tutorial: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-10T05:41:49+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/junit5-tutorial-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"JUnit5 Tutorial: Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31469","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31469"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31469\/revisions"}],"predecessor-version":[{"id":31470,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31469\/revisions\/31470"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31469"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31469"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31469"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}