[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"me":3,"catalog:en:backend\u002Fjava-testing-tooling":4,"config":253},null,{"field_key":5,"field_name":6,"seniority":7,"topic_key":8,"topic_name":9,"spec_key":7,"spec_name":7,"locale":10,"cell_total":11,"field_total":12,"seniorities":13,"topics":17,"specs":148,"samples":168},"backend","Backend","","java-testing-tooling","Java Testing Tooling","en",75,3300,[14,15,16],"junior","mid","senior",[18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124,127,130,133,136,139,142,145],{"key":19,"name":20,"count":11},"api-design","API Design",{"key":22,"name":23,"count":11},"caching","Caching",{"key":25,"name":26,"count":11},"concurrency","Concurrency",{"key":28,"name":29,"count":11},"csharp-concurrency-async","Csharp Concurrency Async",{"key":31,"name":32,"count":11},"csharp-exceptions","Csharp Exceptions",{"key":34,"name":35,"count":11},"csharp-generics-interfaces","Csharp Generics Interfaces",{"key":37,"name":38,"count":11},"csharp-memory-performance","Csharp Memory Performance",{"key":40,"name":41,"count":11},"csharp-stdlib-http","Csharp Stdlib Http",{"key":43,"name":44,"count":11},"csharp-testing-tooling","Csharp Testing Tooling",{"key":46,"name":47,"count":11},"databases-sql","Databases \u002F SQL",{"key":49,"name":50,"count":11},"go-concurrency","Go Concurrency",{"key":52,"name":53,"count":11},"go-errors","Go Errors",{"key":55,"name":56,"count":11},"go-interfaces-generics","Go Interfaces Generics",{"key":58,"name":59,"count":11},"go-memory-performance","Go Memory Performance",{"key":61,"name":62,"count":11},"go-stdlib-http","Go Stdlib Http",{"key":64,"name":65,"count":11},"go-testing-tooling","Go Testing Tooling",{"key":67,"name":68,"count":11},"java-concurrency","Java Concurrency",{"key":70,"name":71,"count":11},"java-exceptions","Java Exceptions",{"key":73,"name":74,"count":11},"java-generics-interfaces","Java Generics Interfaces",{"key":76,"name":77,"count":11},"java-memory-jvm","Java Memory Jvm",{"key":79,"name":80,"count":11},"java-stdlib-http","Java Stdlib Http",{"key":8,"name":9,"count":11},{"key":83,"name":84,"count":11},"messaging-queues","Messaging \u002F Queues",{"key":86,"name":87,"count":11},"networking-http","Networking \u002F HTTP",{"key":89,"name":90,"count":11},"nodejs-error-handling","Nodejs Error Handling",{"key":92,"name":93,"count":11},"nodejs-event-loop-async","Nodejs Event Loop Async",{"key":95,"name":96,"count":11},"nodejs-memory-performance","Nodejs Memory Performance",{"key":98,"name":99,"count":11},"nodejs-modules-streams","Nodejs Modules Streams",{"key":101,"name":102,"count":11},"nodejs-stdlib-http","Nodejs Stdlib Http",{"key":104,"name":105,"count":11},"nodejs-testing-tooling","Nodejs Testing Tooling",{"key":107,"name":108,"count":11},"php-concurrency-async","Php Concurrency Async",{"key":110,"name":111,"count":11},"php-exceptions","Php Exceptions",{"key":113,"name":114,"count":11},"php-generics-interfaces","Php Generics Interfaces",{"key":116,"name":117,"count":11},"php-memory-performance","Php Memory Performance",{"key":119,"name":120,"count":11},"php-stdlib-http","Php Stdlib Http",{"key":122,"name":123,"count":11},"php-testing-tooling","Php Testing Tooling",{"key":125,"name":126,"count":11},"python-concurrency-async","Python Concurrency Async",{"key":128,"name":129,"count":11},"python-errors-context","Python Errors Context",{"key":131,"name":132,"count":11},"python-memory-performance","Python Memory Performance",{"key":134,"name":135,"count":11},"python-stdlib-http","Python Stdlib Http",{"key":137,"name":138,"count":11},"python-testing-tooling","Python Testing Tooling",{"key":140,"name":141,"count":11},"python-typing-oop","Python Typing Oop",{"key":143,"name":144,"count":11},"security","Security",{"key":146,"name":147,"count":11},"testing","Testing",[149,153,156,159,162,165],{"key":150,"name":151,"count":152},"csharp","C#\u002F.NET",450,{"key":154,"name":155,"count":152},"go","Go",{"key":157,"name":158,"count":152},"java","Java",{"key":160,"name":161,"count":152},"nodejs","Node.js",{"key":163,"name":164,"count":152},"php","PHP",{"key":166,"name":167,"count":152},"python","Python",[169,187,201,214,227,240],{"id":170,"topic":9,"difficulty":171,"body":172,"options":173,"correct_key":178,"explanation":186},"019f6e5f-2440-7bd8-8ef9-643d6d1f61ee",1,"In JUnit 5, what is required for a method to be picked up and run as a test by the test runner?",[174,177,180,183],{"key":175,"text":176},"a","The method name must start with the word `test`, since JUnit 5 still relies on naming conventions like JUnit 3 did",{"key":178,"text":179},"b","The method must be annotated with `@Test` (or a related test-registering annotation such as `@ParameterizedTest`)",{"key":181,"text":182},"c","The method must be declared `public static` so the runner can invoke it without creating a test instance",{"key":184,"text":185},"d","The class must implement a `Testable` interface that exposes the method to the JUnit 5 discovery engine","JUnit 5 discovers tests purely through annotations, not naming conventions. A method annotated with `@Test` (or `@ParameterizedTest`, `@RepeatedTest`, etc.) is registered as a test. There is no required method name prefix, no `public static` requirement (instance methods are used, package-private is enough), and no `Testable` interface to implement.",{"id":188,"topic":9,"difficulty":189,"body":190,"options":191,"correct_key":175,"explanation":200},"019f6e5f-2443-734a-a422-fc9ef82dfb8d",2,"```java\nclass CounterTest {\n    int count;\n\n    @BeforeEach\n    void setUp() {\n        count = 10;\n        System.out.println(\"setUp\");\n    }\n\n    @Test\n    void increments() {\n        count++;\n        System.out.println(\"test:\" + count);\n    }\n\n    @AfterEach\n    void tearDown() {\n        System.out.println(\"tearDown:\" + count);\n    }\n}\n```\nWhat is printed when `increments()` runs?",[192,194,196,198],{"key":175,"text":193},"setUp, test:11, tearDown:11 — because `@BeforeEach` runs before the test and `@AfterEach` runs after, using the same instance state",{"key":178,"text":195},"test:11, setUp, tearDown:10 — because JUnit runs the annotated test method first and only wires lifecycle hooks around it afterward for cleanup",{"key":181,"text":197},"setUp, test:11, tearDown:0 — because `@AfterEach` runs on a freshly re-initialized field before it prints",{"key":184,"text":199},"setUp, tearDown:10, test:11 — because `@AfterEach` restores the field to its pre-test value before printing it","For each `@Test` method, JUnit 5 runs `@BeforeEach` first, then the test itself, then `@AfterEach` — all on the SAME test instance, so field state carries over between them. `setUp` sets `count = 10` and prints `setUp`. The test increments to 11 and prints `test:11`. `tearDown` then prints the current `count`, which is still 11, giving `tearDown:11`.",{"id":202,"topic":9,"difficulty":189,"body":203,"options":204,"correct_key":175,"explanation":213},"019f6e5f-2444-7377-b41c-a6d130884a21","```java\n@Test\nvoid checksTotal() {\n    int actualTotal = computeTotal(); \u002F\u002F returns 7\n    assertEquals(actualTotal, 10);\n}\n```\nThe test fails. What does the failure message report?",[205,207,209,211],{"key":175,"text":206},"\"expected: \u003C7> but was: \u003C10>\" — because the first argument passed to `assertEquals` is treated as expected, and here `actualTotal` (7) was passed first by mistake",{"key":178,"text":208},"\"expected: \u003C10> but was: \u003C7>\" — because JUnit always labels the smaller numeric value as the actual result regardless of argument order, inferring intent from the values themselves rather than their position",{"key":181,"text":210},"A compile error, because `assertEquals` requires the literal expected value to be passed as the second argument",{"key":184,"text":212},"\"expected: \u003C10> but was: \u003C10>\" — because JUnit resolves both arguments to the same comparison target before reporting them","`assertEquals(expected, actual)` treats its FIRST argument as \"expected\" and the SECOND as \"actual\", purely by position — it has no idea which variable name means what. Here the call is `assertEquals(actualTotal, 10)`, so JUnit reports `actualTotal` (7) as expected and `10` as actual: \"expected: \u003C7> but was: \u003C10>\". This is a common junior mistake — the arguments are swapped, which doesn't change whether the test passes\u002Ffails but does produce a misleading message.",{"id":215,"topic":9,"difficulty":189,"body":216,"options":217,"correct_key":184,"explanation":226},"019f6e5f-2445-7149-a919-5a171bcb2b78","```java\n@Test\nvoid rejectsNegativeAmount() {\n    Account acc = new Account();\n    IllegalArgumentException ex = assertThrows(\n        IllegalArgumentException.class,\n        () -> acc.withdraw(-5)\n    );\n    assertEquals(\"amount must be positive\", ex.getMessage());\n}\n```\nWhat does `assertThrows` return here, and why is that useful?",[218,220,222,224],{"key":175,"text":219},"It returns `void`; `ex` is actually assigned by a hidden static field that JUnit's internal reporting mechanism populates only after the whole lambda has finished running, which the test then reads back",{"key":178,"text":221},"It returns a `boolean` indicating whether the exception was thrown, and `ex` is auto-cast to the exception type for convenience",{"key":181,"text":223},"It returns the lambda (`Executable`) itself, letting the test re-invoke `acc.withdraw(-5)` again to inspect the exception",{"key":184,"text":225},"It returns the caught exception instance (typed as `IllegalArgumentException`), letting the test make further assertions on its state such as the message","`assertThrows(expectedType, executable)` runs the executable, asserts that it throws an exception assignable to `expectedType`, and returns that caught exception (already cast to `expectedType`). This lets the test go beyond \"an exception was thrown\" and assert on details like `ex.getMessage()` or `ex.getCause()`. If no exception is thrown, or the wrong type is thrown, `assertThrows` itself fails the test.",{"id":228,"topic":9,"difficulty":171,"body":229,"options":230,"correct_key":178,"explanation":239},"019f6e5f-2446-71ce-a414-da695460c108","```java\n@Test\nvoid parsesConfig() {\n    Config c = Config.parse(\"invalid\"); \u002F\u002F throws NumberFormatException internally\n    assertNotNull(c);\n}\n```\nIf `Config.parse(\"invalid\")` throws an unchecked `NumberFormatException` that the test does not catch, what happens to the test?",[231,233,235,237],{"key":175,"text":232},"The test passes, because JUnit only evaluates the final `assertNotNull` statement in a test method and never reaches an exception thrown by earlier lines before it",{"key":178,"text":234},"The test fails\u002Ferrors, because any uncaught exception propagating out of a `@Test` method is reported as a test failure",{"key":181,"text":236},"The test is skipped, because JUnit treats uncaught runtime exceptions the same way it treats `@Disabled`",{"key":184,"text":238},"The build stops immediately and no other test methods in the class or suite are executed","A `@Test` method does not need `assertThrows` to fail on an exception — ANY exception (checked or unchecked) that propagates out of the test method is caught by the JUnit runner and reported as a failed\u002Ferrored test. It never reaches `assertNotNull` in this case. Other tests in the class and suite still run; JUnit isolates failures per test method.",{"id":241,"topic":9,"difficulty":189,"body":242,"options":243,"correct_key":181,"explanation":252},"019f6e5f-2447-78d0-88d6-5b9decc1b09e","```java\ninterface PaymentGateway {\n    boolean charge(String cardId, int amountCents);\n    String lastTransactionId();\n}\n\n@Test\nvoid unstubbedMockReturnsDefaults() {\n    PaymentGateway gw = mock(PaymentGateway.class);\n\n    boolean result = gw.charge(\"card-1\", 500);\n    String txId = gw.lastTransactionId();\n\n    assertFalse(result);\n    assertNull(txId);\n}\n```\nWithout any `when(...).thenReturn(...)` stubbing, why does this test pass?",[244,246,248,250],{"key":175,"text":245},"It doesn't pass — calling any method on a Mockito mock without stubbing throws `UnnecessaryStubbingException` at runtime",{"key":178,"text":247},"Mockito records the calls but replays the real `PaymentGateway` implementation found on the classpath, which happens to return `false`\u002F`null` for these inputs",{"key":181,"text":249},"A Mockito mock returns type-appropriate default values for unstubbed methods — `false` for `boolean`, `null` for object return types, `0` for numeric types",{"key":184,"text":251},"The mock throws a `NullPointerException` on the first unstubbed call, which the test framework silently converts into a passing assertion","A Mockito mock created with `mock(...)` has NO real behavior by default. For any method call that hasn't been stubbed with `when(...).thenReturn(...)`, Mockito returns a sensible default based on the return type: `false` for `boolean`, `0`\u002F`0.0` for numeric primitives, `null` for object references (including `String`), and empty collections for collection return types. No exception is thrown just for calling an unstubbed method.",{"fields":254,"seniorities":424,"interview_shapes":425,"locales":430,"oauth":432,"question_count":435,"coach_enabled":436,"jd_match_enabled":436},[255,266,286,303,327,340,359,378,398,405,411,418],{"key":5,"name_tr":6,"name_en":6,"sort":171,"specializations":256},[257,260,261,262,263,264,265],{"key":258,"name":259,"field":5},"general","Genel",{"key":154,"name":155,"field":5},{"key":166,"name":167,"field":5},{"key":157,"name":158,"field":5},{"key":150,"name":151,"field":5},{"key":160,"name":161,"field":5},{"key":163,"name":164,"field":5},{"key":267,"name_tr":268,"name_en":268,"sort":189,"specializations":269},"frontend","Frontend",[270,271,274,277,280,283],{"key":258,"name":259,"field":267},{"key":272,"name":273,"field":267},"javascript","JavaScript",{"key":275,"name":276,"field":267},"typescript","TypeScript",{"key":278,"name":279,"field":267},"react","React",{"key":281,"name":282,"field":267},"vue","Vue",{"key":284,"name":285,"field":267},"angular","Angular",{"key":287,"name_tr":288,"name_en":288,"sort":289,"specializations":290},"fullstack","Fullstack",3,[291,292,293,294,295,296,297,298,299,300,301,302],{"key":258,"name":259,"field":287},{"key":154,"name":155,"field":5},{"key":166,"name":167,"field":5},{"key":157,"name":158,"field":5},{"key":150,"name":151,"field":5},{"key":160,"name":161,"field":5},{"key":163,"name":164,"field":5},{"key":272,"name":273,"field":267},{"key":275,"name":276,"field":267},{"key":278,"name":279,"field":267},{"key":281,"name":282,"field":267},{"key":284,"name":285,"field":267},{"key":304,"name_tr":305,"name_en":305,"sort":306,"specializations":307},"devops-cloud","DevOps \u002F Cloud",4,[308,309,312,315,318,321,324],{"key":258,"name":259,"field":304},{"key":310,"name":311,"field":304},"aws","AWS",{"key":313,"name":314,"field":304},"gcp","GCP",{"key":316,"name":317,"field":304},"azure","Azure",{"key":319,"name":320,"field":304},"kubernetes","Kubernetes",{"key":322,"name":323,"field":304},"terraform","Terraform",{"key":325,"name":326,"field":304},"linux","Linux",{"key":328,"name_tr":329,"name_en":329,"sort":330,"specializations":331},"ai-engineer","AI Engineer",5,[332,333,334,337],{"key":258,"name":259,"field":328},{"key":166,"name":167,"field":328},{"key":335,"name":336,"field":328},"llm-rag","LLM\u002FRAG",{"key":338,"name":339,"field":328},"mlops","MLOps",{"key":341,"name_tr":342,"name_en":343,"sort":344,"specializations":345},"database","Veritabanı","Database",6,[346,347,350,353,356],{"key":258,"name":259,"field":341},{"key":348,"name":349,"field":341},"postgresql","PostgreSQL",{"key":351,"name":352,"field":341},"mysql","MySQL",{"key":354,"name":355,"field":341},"mongodb","MongoDB",{"key":357,"name":358,"field":341},"redis","Redis",{"key":360,"name_tr":361,"name_en":362,"sort":363,"specializations":364},"mobile","Mobil","Mobile",7,[365,366,369,372,375],{"key":258,"name":259,"field":360},{"key":367,"name":368,"field":360},"ios-swift","iOS (Swift)",{"key":370,"name":371,"field":360},"android-kotlin","Android (Kotlin)",{"key":373,"name":374,"field":360},"flutter","Flutter",{"key":376,"name":377,"field":360},"react-native","React Native",{"key":143,"name_tr":379,"name_en":144,"sort":380,"specializations":381},"Güvenlik",8,[382,383,386,389,392,395],{"key":258,"name":259,"field":143},{"key":384,"name":385,"field":143},"appsec","AppSec",{"key":387,"name":388,"field":143},"offensive-pentest","Offensive \u002F Pentest",{"key":390,"name":391,"field":143},"cloud-security","Cloud Security",{"key":393,"name":394,"field":143},"devsecops","DevSecOps",{"key":396,"name":397,"field":143},"blue-team-incident","Blue Team \u002F Incident",{"key":399,"name_tr":400,"name_en":401,"sort":402,"specializations":403},"qa-test-automation","QA \u002F Test Otomasyonu","QA \u002F Test Automation",9,[404],{"key":258,"name":259,"field":399},{"key":406,"name_tr":407,"name_en":407,"sort":408,"specializations":409},"data-engineer","Data Engineer",10,[410],{"key":258,"name":259,"field":406},{"key":412,"name_tr":413,"name_en":414,"sort":415,"specializations":416},"game-dev","Oyun Geliştirme","Game Development",11,[417],{"key":258,"name":259,"field":412},{"key":419,"name_tr":420,"name_en":420,"sort":421,"specializations":422},"ml-engineer","ML Engineer",12,[423],{"key":258,"name":259,"field":419},[14,15,16],{"junior":426,"mid":428,"senior":429},{"questions":427,"median_sec":3},20,{"questions":427,"median_sec":3},{"questions":427,"median_sec":3},[431,10],"tr",[433,434],"google","github",21750,true]