{"id":33285,"date":"2025-11-01T03:41:35","date_gmt":"2025-11-01T00:41:35","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=33285"},"modified":"2025-11-01T03:41:35","modified_gmt":"2025-11-01T00:41:35","slug":"birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/","title":{"rendered":"Birim Testlerinde Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi ve Mocking \u0130htiyac\u0131"},"content":{"rendered":"<p><body><\/p>\n<p>Yaz\u0131l\u0131m geli\u015ftirmede, birim testleri (unit tests) kodumuzun g\u00fcvenilirli\u011fini ve kalitesini sa\u011flaman\u0131n temel ta\u015flar\u0131ndan biridir. Ancak, test edilen s\u0131n\u0131f\u0131n (System Under Test &#8211; SUT) d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar\u0131 oldu\u011funda, bu ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmek test yazmay\u0131 karma\u015f\u0131k hale getirebilir. \u0130\u015fte bu noktada Mockito gibi mocking k\u00fct\u00fcphaneleri ve \u00f6zellikle <code>@InjectMocks<\/code> anotasyonu devreye girer.<\/p>\n<p>Bu rehberde, Mockito&#8217;nun <code>@InjectMocks<\/code> anotasyonunun ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve birim testlerinizde ba\u011f\u0131ml\u0131l\u0131k enjeksiyonunu nas\u0131l basitle\u015ftirdi\u011fini ayr\u0131nt\u0131l\u0131 olarak inceleyece\u011fiz. Amac\u0131m\u0131z, testlerinizi daha okunabilir, s\u00fcrd\u00fcr\u00fclebilir ve etkili hale getirmenize yard\u0131mc\u0131 olacak pratik bilgiler sunmakt\u0131r.<\/p>\n<hr>\n<h2>Birim Testlerinde Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi ve Mocking \u0130htiyac\u0131<\/h2>\n<p>Bir yaz\u0131l\u0131m bile\u015fenini izole bir \u015fekilde test etmek istedi\u011fimizde, bu bile\u015fenin ba\u011fl\u0131 oldu\u011fu di\u011fer bile\u015fenlerin (\u00f6rne\u011fin, bir veritaban\u0131 servisi, harici bir API istemcisi, ba\u015fka bir i\u015f mant\u0131\u011f\u0131 s\u0131n\u0131f\u0131) ger\u00e7ek implementasyonlar\u0131n\u0131 kullanmak genellikle istenmez. Bunun birka\u00e7 nedeni vard\u0131r:<\/p>\n<ul>\n<li><strong>\u0130zolasyon Eksikli\u011fi:<\/strong> Ger\u00e7ek ba\u011f\u0131ml\u0131l\u0131klar kullan\u0131ld\u0131\u011f\u0131nda, test edilen bile\u015fenin kendisinden kaynaklanmayan hatalar test sonu\u00e7lar\u0131n\u0131 etkileyebilir. Bu, hatan\u0131n ger\u00e7ek kayna\u011f\u0131n\u0131 bulmay\u0131 zorla\u015ft\u0131r\u0131r.<\/li>\n<li><strong>Performans:<\/strong> Veritaban\u0131 i\u015flemleri veya a\u011f istekleri gibi ger\u00e7ek ba\u011f\u0131ml\u0131l\u0131klar, testlerin yava\u015f \u00e7al\u0131\u015fmas\u0131na neden olur. Birim testlerinin h\u0131zl\u0131 olmas\u0131 esast\u0131r.<\/li>\n<li><strong>Deterministik Olmama:<\/strong> Ger\u00e7ek ba\u011f\u0131ml\u0131l\u0131klar, her zaman ayn\u0131 sonucu vermeyebilir (\u00f6rne\u011fin, veritaban\u0131ndaki veriler de\u011fi\u015febilir, a\u011f hatalar\u0131 olu\u015fabilir). Birim testleri deterministik olmal\u0131, yani her zaman ayn\u0131 girdi i\u00e7in ayn\u0131 \u00e7\u0131kt\u0131y\u0131 \u00fcretmelidir.<\/li>\n<li><strong>Senaryo K\u0131s\u0131tlamalar\u0131:<\/strong> Belirli hata durumlar\u0131n\u0131 veya u\u00e7 durumlar\u0131 (edge cases) ger\u00e7ek ba\u011f\u0131ml\u0131l\u0131klarla sim\u00fcle etmek zor veya imkans\u0131z olabilir.<\/li>\n<\/ul>\n<p>Bu sorunlar\u0131 \u00e7\u00f6zmek i\u00e7in &#8220;mocking&#8221; (taklit etme) veya &#8220;stubbing&#8221; (taklit veri sa\u011flama) tekniklerini kullan\u0131r\u0131z. Mockito, bu teknikleri Java&#8217;da kolayca uygulaman\u0131z\u0131 sa\u011flayan pop\u00fcler bir k\u00fct\u00fcphanedir. Ba\u011f\u0131ml\u0131l\u0131klar\u0131 taklit ederek, test etti\u011fimiz s\u0131n\u0131f\u0131n d\u0131\u015f d\u00fcnya ile etkile\u015fimlerini kontrol edebilir ve belirli davran\u0131\u015flar\u0131 sim\u00fcle edebiliriz.<\/p>\n<hr>\n<h2><code>@Mock<\/code> ve <code>@InjectMocks<\/code> Anotasyonlar\u0131n\u0131 Tan\u0131yal\u0131m<\/h2>\n<p>Mockito, test yazmay\u0131 kolayla\u015ft\u0131ran \u00e7e\u015fitli anotasyonlar sunar. Bu anotasyonlardan ikisi, ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu ba\u011flam\u0131nda birlikte kullan\u0131ld\u0131\u011f\u0131nda g\u00fc\u00e7l\u00fc bir ikili olu\u015fturur: <code>@Mock<\/code> ve <code>@InjectMocks<\/code>.<\/p>\n<h3><code>@Mock<\/code> Anotasyonu<\/h3>\n<p><code>@Mock<\/code> anotasyonu, bir s\u0131n\u0131f\u0131n taklit (mock) edilmi\u015f bir \u00f6rne\u011fini olu\u015fturmak i\u00e7in kullan\u0131l\u0131r. Bu taklit nesneler, ger\u00e7ek implementasyonlar\u0131 yerine, test senaryomuzda tan\u0131mlad\u0131\u011f\u0131m\u0131z davran\u0131\u015flar\u0131 sergiler. \u00d6rne\u011fin, bir veritaban\u0131 deposu (repository) s\u0131n\u0131f\u0131n\u0131n taklit edilmi\u015f bir versiyonunu olu\u015fturarak, veritaban\u0131 \u00e7a\u011fr\u0131lar\u0131 yerine belirli verileri d\u00f6nd\u00fcrmesini sa\u011flayabiliriz.<\/p>\n<pre><code class=\"language-java\">\nimport org.mockito.Mock;\n\npublic class UserServiceTest {\n\n    @Mock\n    private UserRepository userRepository; \/\/ UserRepository'nin taklit edilmi\u015f bir \u00f6rne\u011fi\n\n    \/\/ ... di\u011fer test kodlar\u0131\n}\n<\/code><\/pre>\n<h3><code>@InjectMocks<\/code> Anotasyonu<\/h3>\n<p><code>@InjectMocks<\/code> anotasyonu ise test etti\u011fimiz s\u0131n\u0131f\u0131n (System Under Test &#8211; SUT) bir \u00f6rne\u011fini olu\u015fturur ve bu \u00f6rne\u011fin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131, test s\u0131n\u0131f\u0131nda tan\u0131mlanm\u0131\u015f <code>@Mock<\/code> veya <code>@Spy<\/code> anotasyonlu alanlardan otomatik olarak enjekte etmeye \u00e7al\u0131\u015f\u0131r. Bu, manuel olarak ba\u011f\u0131ml\u0131l\u0131klar\u0131 olu\u015fturup SUT&#8217;a ge\u00e7irme zahmetini ortadan kald\u0131r\u0131r ve test kodunu daha temiz hale getirir.<\/p>\n<pre><code class=\"language-java\">\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\n\npublic class UserServiceTest {\n\n    @Mock\n    private UserRepository userRepository;\n\n    @InjectMocks\n    private UserService userService; \/\/ Test edilen UserService \u00f6rne\u011fi\n\n    \/\/ ... di\u011fer test kodlar\u0131\n}\n<\/code><\/pre>\n<p>Mockito, <code>@InjectMocks<\/code> ile i\u015faretlenmi\u015f bir nesneye ba\u011f\u0131ml\u0131l\u0131klar\u0131 enjekte ederken belirli bir s\u0131ra izler:<\/p>\n<ol>\n<li><strong>Constructor Enjeksiyonu:<\/strong> \u00d6ncelikle, enjekte edilecek t\u00fcm mock&#8217;lar\u0131 parametre olarak alabilen bir constructor arar. E\u011fer birden fazla uygun constructor varsa, en \u00e7ok ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 enjekte edebilen constructor&#8217;\u0131 tercih eder.<\/li>\n<li><strong>Setter Enjeksiyonu:<\/strong> E\u011fer uygun bir constructor bulamazsa, ba\u011f\u0131ml\u0131l\u0131klar\u0131 enjekte etmek i\u00e7in setter metotlar\u0131n\u0131 (\u00f6rne\u011fin, <code>setUserRepository(UserRepository repository)<\/code>) kullanmaya \u00e7al\u0131\u015f\u0131r.<\/li>\n<li><strong>Field Enjeksiyonu:<\/strong> Son \u00e7are olarak, ba\u011f\u0131ml\u0131l\u0131klar\u0131 do\u011frudan alanlar (fields) \u00fczerinden enjekte etmeye \u00e7al\u0131\u015f\u0131r.<\/li>\n<\/ol>\n<p>Bu otomatik enjeksiyon mekanizmas\u0131, test kurulumunu b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir ve ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu prensiplerine uygun kod yazmay\u0131 te\u015fvik eder.<\/p>\n<hr>\n<h2><code>@InjectMocks<\/code> ve <code>@Mock<\/code> Birlikte Kullan\u0131m\u0131: Pratik \u00d6rnekler<\/h2>\n<p>\u015eimdi, <code>@InjectMocks<\/code> ve <code>@Mock<\/code> anotasyonlar\u0131n\u0131 bir \u00f6rnek \u00fczerinden nas\u0131l kullanaca\u011f\u0131m\u0131za bakal\u0131m. Bir <code>UserService<\/code> s\u0131n\u0131f\u0131m\u0131z oldu\u011funu ve bu s\u0131n\u0131f\u0131n kullan\u0131c\u0131 verilerini y\u00f6netmek i\u00e7in bir <code>UserRepository<\/code> ba\u011f\u0131ml\u0131l\u0131\u011f\u0131na sahip oldu\u011funu varsayal\u0131m.<\/p>\n<h3>\u00d6rnek S\u0131n\u0131flar (System Under Test ve Ba\u011f\u0131ml\u0131l\u0131\u011f\u0131)<\/h3>\n<pre><code class=\"language-java\">\n\/\/ UserRepository.java\npublic class UserRepository {\n    public User findUserById(String id) {\n        \/\/ Ger\u00e7ekte veritaban\u0131 sorgusu yapar\n        System.out.println(\"Veritaban\u0131ndan kullan\u0131c\u0131 aran\u0131yor...\");\n        throw new UnsupportedOperationException(\"Ger\u00e7ek veritaban\u0131 eri\u015fimi testlerde kullan\u0131lmamal\u0131d\u0131r!\");\n    }\n\n    public void saveUser(User user) {\n        \/\/ Ger\u00e7ekte veritaban\u0131na kaydeder\n        System.out.println(\"Kullan\u0131c\u0131 veritaban\u0131na kaydediliyor...\");\n        throw new UnsupportedOperationException(\"Ger\u00e7ek veritaban\u0131 eri\u015fimi testlerde kullan\u0131lmamal\u0131d\u0131r!\");\n    }\n}\n\n\/\/ User.java (Basit bir POJO)\npublic class User {\n    private String id;\n    private String name;\n    private String email;\n\n    public User(String id, String name, String email) {\n        this.id = id;\n        this.name = name;\n        this.email = email;\n    }\n\n    \/\/ Getter ve Setter'lar\n    public String getId() { return id; }\n    public void setId(String id) { this.id = id; }\n    public String getName() { return name; }\n    public void setName(String name) { this.name = name; }\n    public String getEmail() { return email; }\n    public void setEmail(String email) { this.email = email; }\n\n    @Override\n    public String toString() {\n        return \"User{id='\" + id + \"', name='\" + name + \"', email='\" + email + \"'}\";\n    }\n}\n\n\/\/ UserService.java (Test Edilecek S\u0131n\u0131f - SUT)\npublic class UserService {\n    private final UserRepository userRepository;\n\n    \/\/ Constructor Enjeksiyonu\n    public UserService(UserRepository userRepository) {\n        this.userRepository = userRepository;\n    }\n\n    public User getUserDetails(String userId) {\n        if (userId == null || userId.isEmpty()) {\n            throw new IllegalArgumentException(\"Kullan\u0131c\u0131 ID bo\u015f olamaz.\");\n        }\n        return userRepository.findUserById(userId);\n    }\n\n    public boolean createUser(String id, String name, String email) {\n        if (id == null || name == null || email == null) {\n            throw new IllegalArgumentException(\"Kullan\u0131c\u0131 bilgileri eksik olamaz.\");\n        }\n        User newUser = new User(id, name, email);\n        userRepository.saveUser(newUser);\n        return true;\n    }\n}\n<\/code><\/pre>\n<h3>UserService \u0130\u00e7in Birim Testi<\/h3>\n<p>\u015eimdi <code>UserService<\/code> s\u0131n\u0131f\u0131n\u0131 test edelim. <code>UserRepository<\/code>&#8216;nin ger\u00e7ek implementasyonu yerine Mockito ile olu\u015fturdu\u011fumuz bir mock&#8217;u kullanaca\u011f\u0131z.<\/p>\n<pre><code class=\"language-java\">\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.Test;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.MockitoAnnotations;\n\nimport static org.junit.jupiter.api.Assertions.*;\nimport static org.mockito.Mockito.*;\n\npublic class UserServiceTest {\n\n    @Mock \/\/ UserRepository'nin taklit edilmi\u015f bir \u00f6rne\u011fini olu\u015fturur\n    private UserRepository userRepository;\n\n    @InjectMocks \/\/ userService \u00f6rne\u011fini olu\u015fturur ve userRepository mock'unu enjekte eder\n    private UserService userService;\n\n    @BeforeEach\n    void setUp() {\n        \/\/ Mockito anotasyonlar\u0131n\u0131 ba\u015flat\u0131r. Bu, @Mock ve @InjectMocks alanlar\u0131n\u0131n i\u015flenmesini sa\u011flar.\n        \/\/ JUnit 5 ile MockitoExtension kullan\u0131l\u0131yorsa bu sat\u0131ra gerek kalmaz.\n        MockitoAnnotations.openMocks(this); \n    }\n\n    @Test\n    void testGetUserDetails_Success() {\n        \/\/ GIVEN: Belirli bir kullan\u0131c\u0131 ID'si i\u00e7in UserRepository'nin ne d\u00f6nd\u00fcrece\u011fini tan\u0131mla\n        String userId = \"123\";\n        User mockUser = new User(userId, \"Ahmet Y\u0131lmaz\", \"ahmet@example.com\");\n        when(userRepository.findUserById(userId)).thenReturn(mockUser);\n\n        \/\/ WHEN: UserService'in getUserDetails metodunu \u00e7a\u011f\u0131r\n        User resultUser = userService.getUserDetails(userId);\n\n        \/\/ THEN: Sonucun beklenen kullan\u0131c\u0131 ile e\u015fle\u015fti\u011fini do\u011frula\n        assertNotNull(resultUser);\n        assertEquals(userId, resultUser.getId());\n        assertEquals(\"Ahmet Y\u0131lmaz\", resultUser.getName());\n        assertEquals(\"ahmet@example.com\", resultUser.getEmail());\n\n        \/\/ UserRepository'nin findUserById metodunun do\u011fru parametrelerle \u00e7a\u011fr\u0131ld\u0131\u011f\u0131n\u0131 do\u011frula\n        verify(userRepository, times(1)).findUserById(userId);\n        \/\/ Ba\u015fka hi\u00e7bir metodun \u00e7a\u011fr\u0131lmad\u0131\u011f\u0131n\u0131 do\u011frula (iste\u011fe ba\u011fl\u0131)\n        verifyNoMoreInteractions(userRepository); \n    }\n\n    @Test\n    void testGetUserDetails_UserNotFound() {\n        \/\/ GIVEN: UserRepository'nin null d\u00f6nd\u00fcrece\u011fini tan\u0131mla (kullan\u0131c\u0131 bulunamad\u0131)\n        String userId = \"456\";\n        when(userRepository.findUserById(userId)).thenReturn(null);\n\n        \/\/ WHEN: UserService'in getUserDetails metodunu \u00e7a\u011f\u0131r\n        User resultUser = userService.getUserDetails(userId);\n\n        \/\/ THEN: Sonucun null oldu\u011funu do\u011frula\n        assertNull(resultUser);\n        verify(userRepository, times(1)).findUserById(userId);\n    }\n\n    @Test\n    void testGetUserDetails_InvalidUserId() {\n        \/\/ WHEN & THEN: Ge\u00e7ersiz ID ile \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda IllegalArgumentException f\u0131rlat\u0131ld\u0131\u011f\u0131n\u0131 do\u011frula\n        assertThrows(IllegalArgumentException.class, () -> {\n            userService.getUserDetails(\"\");\n        });\n        \/\/ UserRepository'nin hi\u00e7bir metodunun \u00e7a\u011fr\u0131lmad\u0131\u011f\u0131n\u0131 do\u011frula\n        verifyNoInteractions(userRepository);\n    }\n\n    @Test\n    void testCreateUser_Success() {\n        \/\/ GIVEN: UserRepository'nin saveUser metodunun hi\u00e7bir \u015fey yapmayaca\u011f\u0131n\u0131 tan\u0131mla (void metodlar i\u00e7in varsay\u0131lan davran\u0131\u015f)\n        \/\/ doNothing().when(userRepository).saveUser(any(User.class)); \/\/ Bu sat\u0131r iste\u011fe ba\u011fl\u0131d\u0131r, varsay\u0131lan olarak void metodlar bir \u015fey yapmaz.\n\n        \/\/ WHEN: UserService'in createUser metodunu \u00e7a\u011f\u0131r\n        boolean success = userService.createUser(\"789\", \"Ay\u015fe Can\", \"ayse@example.com\");\n\n        \/\/ THEN: \u0130\u015flemin ba\u015far\u0131l\u0131 oldu\u011funu do\u011frula\n        assertTrue(success);\n\n        \/\/ UserRepository'nin saveUser metodunun do\u011fru parametrelerle \u00e7a\u011fr\u0131ld\u0131\u011f\u0131n\u0131 do\u011frula\n        \/\/ any(User.class) ile herhangi bir User nesnesinin kabul edildi\u011fini belirtiriz.\n        verify(userRepository, times(1)).saveUser(any(User.class));\n    }\n\n    @Test\n    void testCreateUser_InvalidInput() {\n        \/\/ WHEN & THEN: Eksik bilgi ile \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda IllegalArgumentException f\u0131rlat\u0131ld\u0131\u011f\u0131n\u0131 do\u011frula\n        assertThrows(IllegalArgumentException.class, () -> {\n            userService.createUser(\"101\", null, \"test@example.com\");\n        });\n        \/\/ UserRepository'nin hi\u00e7bir metodunun \u00e7a\u011fr\u0131lmad\u0131\u011f\u0131n\u0131 do\u011frula\n        verifyNoInteractions(userRepository);\n    }\n}\n<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte:<\/p>\n<ul>\n<li><code>@Mock private UserRepository userRepository;<\/code> sat\u0131r\u0131, <code>UserRepository<\/code> s\u0131n\u0131f\u0131n\u0131n sahte bir \u00f6rne\u011fini olu\u015fturur. Bu \u00f6rnek, ger\u00e7ek veritaban\u0131 i\u015flemlerini yapmaz.<\/li>\n<li><code>@InjectMocks private UserService userService;<\/code> sat\u0131r\u0131, <code>UserService<\/code> s\u0131n\u0131f\u0131n\u0131n bir \u00f6rne\u011fini olu\u015fturur ve bu \u00f6rne\u011fe <code>userRepository<\/code> mock&#8217;unu constructor arac\u0131l\u0131\u011f\u0131yla otomatik olarak enjekte eder.<\/li>\n<li><code>@BeforeEach void setUp() { MockitoAnnotations.openMocks(this); }<\/code> metodu, her test metodu \u00e7al\u0131\u015fmadan \u00f6nce Mockito anotasyonlar\u0131n\u0131 ba\u015flat\u0131r. JUnit 5 kullan\u0131yorsan\u0131z, <code>@ExtendWith(MockitoExtension.class)<\/code> anotasyonunu test s\u0131n\u0131f\u0131na ekleyerek bu sat\u0131r\u0131 atlayabilirsiniz.<\/li>\n<li><code>when(userRepository.findUserById(userId)).thenReturn(mockUser);<\/code> gibi sat\u0131rlarla, mock objesinin belirli bir metot \u00e7a\u011fr\u0131s\u0131na nas\u0131l yan\u0131t verece\u011fini (yani ne d\u00f6nd\u00fcrece\u011fini) belirtiriz.<\/li>\n<li><code>verify(userRepository, times(1)).findUserById(userId);<\/code> gibi sat\u0131rlarla, mock objesinin belirli bir metodunun beklendi\u011fi gibi \u00e7a\u011fr\u0131l\u0131p \u00e7a\u011fr\u0131lmad\u0131\u011f\u0131n\u0131 do\u011frular\u0131z.<\/li>\n<\/ul>\n<p>Bu yap\u0131 sayesinde, <code>UserService<\/code> s\u0131n\u0131f\u0131n\u0131n i\u00e7 mant\u0131\u011f\u0131n\u0131, <code>UserRepository<\/code>&#8216;nin karma\u015f\u0131k veya yava\u015f ger\u00e7ek implementasyonundan etkilenmeden, izole bir \u015fekilde test edebiliriz.<\/p>\n<hr>\n<h2>\u0130leri Seviye Kullan\u0131m ve Pratik \u0130pu\u00e7lar\u0131<\/h2>\n<h3>JUnit 5 ve <code>MockitoExtension<\/code><\/h3>\n<p>JUnit 5 kullan\u0131yorsan\u0131z, <code>@ExtendWith(MockitoExtension.class)<\/code> anotasyonunu test s\u0131n\u0131f\u0131n\u0131za ekleyerek <code>MockitoAnnotations.openMocks(this);<\/code> \u00e7a\u011fr\u0131s\u0131n\u0131 otomatik hale getirebilirsiniz. Bu, test kurulumunu daha da basitle\u015ftirir.<\/p>\n<pre><code class=\"language-java\">\nimport org.junit.jupiter.api.extension.ExtendWith;\nimport org.mockito.junit.jupiter.MockitoExtension;\n\n@ExtendWith(MockitoExtension.class) \/\/ Bu sat\u0131r Mockito anotasyonlar\u0131n\u0131 otomatik ba\u015flat\u0131r\npublic class UserServiceTest {\n    \/\/ ... test kodlar\u0131\n}\n<\/code><\/pre>\n<h3>Birden Fazla Constructor Durumu<\/h3>\n<p>E\u011fer test edilen s\u0131n\u0131f\u0131n birden fazla constructor&#8217;\u0131 varsa, Mockito <code>@InjectMocks<\/code> ile enjekte edilecek mock&#8217;lar\u0131 en iyi e\u015fle\u015fen constructor&#8217;a g\u00f6re bulmaya \u00e7al\u0131\u015f\u0131r. Genellikle, en fazla parametreyi alabilen ve t\u00fcm parametreleri i\u00e7in uygun mock&#8217;lar bulunan constructor&#8217;\u0131 tercih eder. E\u011fer a\u00e7\u0131k\u00e7a belirtilmezse ve birden fazla e\u015fle\u015fen constructor varsa, Mockito&#8217;nun davran\u0131\u015f\u0131 belirsiz olabilir veya bekledi\u011finiz gibi \u00e7al\u0131\u015fmayabilir. Bu y\u00fczden, genellikle tek bir ana constructor&#8217;a sahip olmak veya constructor&#8217;lar\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 a\u00e7\u0131k\u00e7a belirten bir hiyerar\u015fi izlemek iyi bir pratik olarak kabul edilir.<\/p>\n<h3>Enjekte Edilemeyen Ba\u011f\u0131ml\u0131l\u0131klar<\/h3>\n<p>E\u011fer <code>@InjectMocks<\/code> ile i\u015faretlenmi\u015f bir s\u0131n\u0131f\u0131n bir ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 varsa ve bu ba\u011f\u0131ml\u0131l\u0131k i\u00e7in test s\u0131n\u0131f\u0131nda ne bir <code>@Mock<\/code> ne de bir <code>@Spy<\/code> tan\u0131mlanmam\u0131\u015fsa, Mockito o ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 enjekte edemez. Bu durumda, o alan genellikle <code>null<\/code> kal\u0131r (e\u011fer temel bir tip de\u011filse) veya varsay\u0131lan de\u011ferini al\u0131r. Bu, testlerinizde <code>NullPointerException<\/code>&#8216;lara yol a\u00e7abilir. Bu nedenle, <code>@InjectMocks<\/code> taraf\u0131ndan y\u00f6netilen bir s\u0131n\u0131f\u0131n t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n ya mock&#8217;lanm\u0131\u015f ya da ger\u00e7ek nesnelerle manuel olarak sa\u011flanm\u0131\u015f oldu\u011fundan emin olmal\u0131s\u0131n\u0131z.<\/p>\n<h3><code>@Spy<\/code> ile K\u0131smi Mocking (Partial Mocking)<\/h3>\n<p>Bazen bir s\u0131n\u0131f\u0131n ger\u00e7ek metodlar\u0131n\u0131n \u00e7o\u011funu kullan\u0131rken, sadece belirli metodlar\u0131n\u0131 taklit etmek isteyebilirsiniz. Bu duruma &#8220;k\u0131smi mocking&#8221; denir ve Mockito&#8217;da <code>@Spy<\/code> anotasyonu ile yap\u0131l\u0131r. <code>@InjectMocks<\/code>, <code>@Mock<\/code> gibi <code>@Spy<\/code> anotasyonlu ba\u011f\u0131ml\u0131l\u0131klar\u0131 da enjekte edebilir. Ancak, k\u0131smi mocking genellikle karma\u015f\u0131kl\u0131\u011f\u0131 art\u0131rd\u0131\u011f\u0131 ve testleri daha k\u0131r\u0131lgan hale getirdi\u011fi i\u00e7in dikkatli kullan\u0131lmal\u0131d\u0131r. Genellikle, bir s\u0131n\u0131f\u0131n t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 mock&#8217;lamak daha iyi bir yakla\u015f\u0131md\u0131r.<\/p>\n<hr>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h2>\n<p>Mockito&#8217;nun <code>@InjectMocks<\/code> anotasyonu, birim testlerinizde ba\u011f\u0131ml\u0131l\u0131k enjeksiyonunu otomatikle\u015ftirerek test kurulumunu basitle\u015ftiren ve kodunuzu daha temiz hale getiren g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. <code>@Mock<\/code> ile birlikte kullan\u0131ld\u0131\u011f\u0131nda, test edilen s\u0131n\u0131f\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kolayca taklit edebilir, b\u00f6ylece testlerinizin izole, h\u0131zl\u0131 ve deterministik olmas\u0131n\u0131 sa\u011flayabilirsiniz. Bu sayede, yaz\u0131l\u0131m\u0131n\u0131z\u0131n kalitesini art\u0131r\u0131rken geli\u015ftirme s\u00fcrecinizi h\u0131zland\u0131rabilirsiniz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>1. <code>@Mock<\/code> ile <code>@InjectMocks<\/code> aras\u0131ndaki temel fark nedir?<\/strong><br \/>\n    <code>@Mock<\/code>, bir ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n taklit edilmi\u015f (sahte) bir \u00f6rne\u011fini olu\u015fturur. Bu mock nesnesinin davran\u0131\u015flar\u0131n\u0131 test senaryonuza g\u00f6re belirlersiniz. <code>@InjectMocks<\/code> ise, test edilen s\u0131n\u0131f\u0131n (SUT) ger\u00e7ek bir \u00f6rne\u011fini olu\u015fturur ve bu \u00f6rne\u011fin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131, test s\u0131n\u0131f\u0131nda tan\u0131mlanm\u0131\u015f <code>@Mock<\/code> veya <code>@Spy<\/code> anotasyonlu alanlardan otomatik olarak enjekte etmeye \u00e7al\u0131\u015f\u0131r. K\u0131sacas\u0131, <code>@Mock<\/code> ba\u011f\u0131ml\u0131l\u0131klar\u0131 yarat\u0131r, <code>@InjectMocks<\/code> ise bu ba\u011f\u0131ml\u0131l\u0131klar\u0131 SUT&#8217;a enjekte eder.<\/p>\n<p><strong>2. <code>@InjectMocks<\/code> manuel ba\u011f\u0131ml\u0131l\u0131k enjeksiyonuyla nas\u0131l kar\u015f\u0131la\u015ft\u0131r\u0131l\u0131r?<\/strong><br \/>\n    Manuel ba\u011f\u0131ml\u0131l\u0131k enjeksiyonunda, test edilen s\u0131n\u0131f\u0131n bir \u00f6rne\u011fini kendiniz olu\u015fturur ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 constructor, setter veya field arac\u0131l\u0131\u011f\u0131yla manuel olarak ge\u00e7ersiniz. \u00d6rne\u011fin: <code>UserService userService = new UserService(userRepositoryMock);<\/code>. <code>@InjectMocks<\/code> bu boilerplate kodunu ortadan kald\u0131r\u0131r. Otomatik olarak SUT&#8217;\u0131 \u00f6rneklendirir ve mevcut mock&#8217;lar\u0131 enjekte eder, b\u00f6ylece test kodunuz daha k\u0131sa ve okunabilir olur.<\/p>\n<p><strong>3. <code>@InjectMocks<\/code> hangi enjeksiyon y\u00f6ntemlerini destekler?<\/strong><br \/>\n    Mockito, <code>@InjectMocks<\/code> ile enjeksiyon yaparken s\u0131ras\u0131yla \u015fu y\u00f6ntemleri dener: constructor enjeksiyonu, setter enjeksiyonu ve field enjeksiyonu. En uygun olan\u0131 buldu\u011funda enjeksiyonu ger\u00e7ekle\u015ftirir.<\/p>\n<p><strong>4. <code>@InjectMocks<\/code> bir ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 enjekte edemezse ne olur?<\/strong><br \/>\n    E\u011fer <code>@InjectMocks<\/code> ile i\u015faretlenmi\u015f bir s\u0131n\u0131f\u0131n bir ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 varsa ve bu ba\u011f\u0131ml\u0131l\u0131k i\u00e7in test s\u0131n\u0131f\u0131nda ne bir <code>@Mock<\/code> ne de bir <code>@Spy<\/code> tan\u0131mlanmam\u0131\u015fsa, Mockito o ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 enjekte edemez. Bu durumda, ilgili alan genellikle <code>null<\/code> kal\u0131r ve bu durum testlerinizde <code>NullPointerException<\/code>&#8216;lara yol a\u00e7abilir.<\/p>\n<p><strong>5. Neden <code>@InjectMocks<\/code> kullanmal\u0131y\u0131z?<\/strong><br \/>\n    <code>@InjectMocks<\/code> kullanmak, test kurulum kodunu azalt\u0131r, testlerinizi daha okunabilir hale getirir ve ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu prensiplerine uygun kod yazmay\u0131 te\u015fvik eder. Test edilen s\u0131n\u0131f\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 otomatik olarak y\u00f6neterek, test yazmaya odaklanman\u0131z\u0131 sa\u011flar ve testlerin bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Yaz\u0131l\u0131m geli\u015ftirmede, birim testleri (unit tests) kodumuzun g\u00fcvenilirli\u011fini ve kalitesini sa\u011flaman\u0131n temel ta\u015flar\u0131ndan biridir. Ancak, test","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-33285","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>Birim Testlerinde Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi ve Mocking \u0130htiyac\u0131 - 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\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Birim Testlerinde Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi ve Mocking \u0130htiyac\u0131\" \/>\n<meta property=\"og:description\" content=\"Yaz\u0131l\u0131m geli\u015ftirmede, birim testleri (unit tests) kodumuzun g\u00fcvenilirli\u011fini ve kalitesini sa\u011flaman\u0131n temel ta\u015flar\u0131ndan biridir. Ancak, test\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-01T00:41:35+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=\"13 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Birim Testlerinde Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi ve Mocking \u0130htiyac\u0131\",\"datePublished\":\"2025-11-01T00:41:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/\"},\"wordCount\":1672,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/\",\"name\":\"Birim Testlerinde Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi ve Mocking \u0130htiyac\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-01T00:41:35+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Birim Testlerinde Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi ve Mocking \u0130htiyac\u0131\"}]},{\"@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":"Birim Testlerinde Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi ve Mocking \u0130htiyac\u0131 - 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\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/","og_locale":"tr_TR","og_type":"article","og_title":"Birim Testlerinde Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi ve Mocking \u0130htiyac\u0131","og_description":"Yaz\u0131l\u0131m geli\u015ftirmede, birim testleri (unit tests) kodumuzun g\u00fcvenilirli\u011fini ve kalitesini sa\u011flaman\u0131n temel ta\u015flar\u0131ndan biridir. Ancak, test","og_url":"https:\/\/fatihsoysal.com\/blog\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-01T00:41:35+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"13 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Birim Testlerinde Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi ve Mocking \u0130htiyac\u0131","datePublished":"2025-11-01T00:41:35+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/"},"wordCount":1672,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/","url":"https:\/\/fatihsoysal.com\/blog\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/","name":"Birim Testlerinde Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi ve Mocking \u0130htiyac\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-01T00:41:35+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/birim-testlerinde-bagimlilik-yonetimi-ve-mocking-ihtiyaci\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Birim Testlerinde Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi ve Mocking \u0130htiyac\u0131"}]},{"@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\/33285","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=33285"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33285\/revisions"}],"predecessor-version":[{"id":33286,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33285\/revisions\/33286"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33285"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33285"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33285"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}