Exam Drill #15 · 11 Sep 2026 · 14 to fix · 65 drills

Fifteenth attempt — you passed

46/60 = 77%, against a 76% pass mark. Your best score in fifteen papers (the previous best was 73% on #9) and +8 marks on #14 — exactly the gap the last page said you had to close. Data Management 100%. Testing 33% → 73%. Finished in 52m 34s.
The margin is one question: 45/60 is 75%, which fails. So this page is about making one spare mark into three or four. Twelve of these fourteen misses cover material already on this site, and eight are the same question you missed before.

77%
Pass mark 76% ✓
+8
Marks on #14 (38 → 46)
14
Misses — was 22
1
Question of margin
Official result · practice exam

77% — congratulations, you passed

76% required to pass · 60/60 answered · 46 correct · time used 52m 34s of 2h 10m
Data Management 100%▲ 370 misses / 6 Spring MVC 89%▬ 01 miss / 9 Spring Core 75%▲ 125 misses / 20 Testing 73%▲ 403 misses / 11 Spring Boot 67%▲ 114 misses / 12 Spring Security 50%▼ 251 miss / 2

The section sizes are exact, not estimated. Fourteen misses spread over 20/6/9/11/2/12 questions reproduce all six official percentages (15/20 = 75%, 8/11 = 72.7% → 73%, 8/12 = 66.7% → 67%, 8/9 = 88.9% → 89%, 1/2 = 50%) and sum to 60. No other split fits.
Security's 50% is one miss out of two questions, not a collapse. Testing was 11 questions this time, nearly double #14's six, so 73% is a real result, not a small-sample swing. And because Data had no misses, Q50 (TransactionInterceptor) must have been scored under Spring Core.

What moved between #14 and #15

Attempt #14Attempt #15Result
Score38/60 (63%)46/60 (77%)Passed — best of fifteen
Misses2214−8
Ticked a false option1711−6
Stopped short (no false tick)53−2
Left blank00Held
Time1h 8m 59s52m 34s77 minutes unused

Six of the eight marks came from false ticks, the failure mode the last page said carried the whole gap. The other two came from stopping short less often.

And look at how narrow the remaining misses are. Across the fourteen questions you missed there were 32 false options. You rejected 21 of them. Not one question had two false ticks. Every miss comes down to a single option you believed, or one true option you didn't take.

A correction to pages #13 and #14: what the results export can actually show

On the results page, an option loses its letter if it's a correct answer or if you ticked it. So a false option with no letter is definitely a tick you made. But a correct option looks the same whether you ticked it or not. Pages #13 and #14 said "you ticked two" on single-answer misses, and the export can't actually show that: you may have ticked only the wrong option.

So this page says "you ticked X" only for false options, and "stopped short" only when no false option was ticked. The advice doesn't change: on each of the eleven, one false statement looked true to you.

The eleven false ticks — and the one fact that kills each

Five of them are sweeping claims: cannot, is not allowed, both, none, the test continues. A sweeping claim falls to a single counterexample. If you can name one property, method or class that breaks it, the option is false.

QThe false statement you tickedThe counterexample
Q5"The severity order cannot be changed due to security reasons"management.endpoint.health.status.order
Q34SpEL supports querying — "manipulation of objects is not allowed"expression.setValue(ctx, value)
Q53"Both fat jar and original jar are executable"The original jar has no Main-Class and no dependencies
Q33"None of the mentioned" is excluded from the starterJUnit 4 was on the list, and it's excluded
Q32"If any assertion fails, the test continues"assertAll exists because it doesn't
Q10"Spring Boot does code generation using an opinionated approach"Boot's stated goal: "absolutely no code generation"
Q46ApplicationContext provides "password encryption"PasswordEncoder — a Spring Security bean
Q60@ComponentScan adds a bean definitionScan a package with no @Component classes and you get zero beans
Q13prePostEnabled = true enables @SecuredsecuredEnabled is named after the annotation it enables
Q44@AutoConfigureDataSourceInvented. You ticked it on #6 too
Q50TransactionStatusAdviceInvented — two real names glued together

You finished with 77 minutes to spare. A second pass that only re-checks options containing cannot / only / not allowed / both / none / always costs perhaps ten minutes. On this paper it would have reached five marks.

The three times you stopped short had one shape: Q28, Q37 and Q45 were all open "which are true" questions with exactly one false option, which you rejected every time. After that there was nothing left to reject, and every remaining option was true. On Q45 three of the true options state the same fact three ways (runs regardless of outcome, like a finally block, suited to cleanup).

Eight of the fourteen are questions you've already missed

The same question, not just the same topic. Four more are close relatives. Only Q32 (assertAll) and Q34 (the SpEL definition) are new to this site.

QTopicAlready on this siteThen → now
Q28True about MVC controllersReview #13 Q29 · MVC round 2Stopped short → stopped short again
Q44@DataJpaTest real databaseReview #6 Q35 · Review #12Two fakes ticked → one fake ticked
Q13Enabling @SecuredSecurity clinic — "asked three times, missed three times" · Review #5Fourth miss
Q60Adding a bean definitionReview #3, with a drill using these exact four options · Review #4 Q25Fourth sitting, third miss
Q37 · Q53Fat jar vs original jarReview #3 Q7 · Review #11 Q10 · Boot clinic"Smaller" ticked on #11 → rejected now, but missed twice
Q33What starter-test leaves outReview #1 Q20 — same stemAnswer was "None" on #1 → JUnit 4 this time
Q45@After adviceReview #3 Q12 & Q13 — "the finally block"Stopped short
Q5Health status orderBoot clinic §health · Review #1related
Q10What Boot does and doesn't doBoot clinic — "what Boot provides, and what it doesn't"related
Q46ApplicationContextReview #10 Q14 · lesson 1related
Q50TransactionInterceptorReview #13 §tx · Data clinicrelated

Q33 is worth a second look. On #1 the stem was the same and "None of the mentioned" was correct, because that list was JUnit 5, Spring Test and Mockito, and all of those are included. This list added JUnit 4, which is excluded. A remembered answer is only good if the options match too.

Several of these are half-fixed, which is real progress. On Q44 you dropped replaceProdDb but kept @AutoConfigureDataSource. On Q37 you rejected "smaller", the option that cost you on #11. One more drill round should finish them.

Where the next three marks are

BucketMarksWhat it costs you
Second pass on sweeping claims5Zero study — ten of the 77 unused minutes. Q5, Q32, Q33, Q34, Q53
Re-drill the eight same-question repeats8Q13, Q28, Q33, Q37, Q44, Q45, Q53, Q60 — all already on this site
Never tick a name you can't place2@AutoConfigureDataSource · TransactionStatusAdvice

The rows overlap (Q33 and Q53 appear in the first two), so don't add them up. Any single row takes you from one mark of margin to three or more. Aim for 48+ next time.

All 14, at a glance

QTopicWhat went wrongThe answer
Q5Health indicator status — "which two"+ "order cannot be changed"Custom statuses exist · default DOWN, OUT_OF_SERVICE, UP, UNKNOWN
Q10What Spring Boot is+ "does code generation"Stand-alone, production-grade · opinionated
Q13Enabling @Secured+ prePostEnabledsecuredEnabled = true
Q28True about MVC controllersStopped short — 3 were trueStereotype · no Servlet API dependency · no inheritance
Q32JUnit 5 assertions+ "the test continues"Messages optional · assertEquals for objects and primitives · checks the fields
Q33What starter-test leaves out+ "None of the mentioned"JUnit 4 (Vintage), dropped in Boot 2.4
Q34What SpEL is+ "querying only"Querying and manipulating an object graph
Q37Fat jar vs regular jarStopped short — 3 were trueExecutable · Main-Class + Start-Class · all dependencies
Q44@DataJpaTest real database+ @AutoConfigureDataSource — invented@AutoConfigureTestDatabase(replace = Replace.NONE)
Q45@After adviceStopped short — 4 were trueAlways runs, like finally · cleanup · no return value or exception
Q46ApplicationContext capabilities+ password encryptioni18n messages · bean factory methods
Q50The class in the transactional proxy+ TransactionStatusAdvice — inventedTransactionInterceptor
Q53Fat jar vs original jar+ "both are executable"You need spring-boot-maven-plugin
Q60Adding a bean definition+ @ComponentScan@Bean method · XML <bean>

Jump to a section

⓪ The counterexample drill — 11 statements ① Spring Core — 5 misses (75%) ② Spring Boot — 4 misses (67%) ③ Testing — 3 misses (73%) ④ Spring MVC — 1 miss (89%) ⑤ Spring Security — 1 miss (1 of 2) Mixed drill — all sections, no headings

⓪ The counterexample drill 5 marks on this paper

Each statement below comes from this paper. Before you answer, name the counterexample — the property, method or class that breaks the claim. If you can name one, the statement is false. If you can't, don't assume it's true; that's the moment to slow down.

The rule

A sweeping claim needs one counterexample. A made-up name needs one question: where have I seen it?

The option says…AskOn this paper
cannot · is not allowed · neverIs there a property or method that does it?Q5, Q34
both · all · none of the mentionedIs there one item the claim fails for?Q53, Q33
continues · always · onlyWhat would the API look like if this were true?Q32
A class or annotation name you can't placeIs it two real names glued together?Q44, Q50

A true word doesn't make an option true. Q10's option called Boot opinionated (true) and said it does code generation (false). Judge the claim, not the vocabulary around it.

Memory hook: Name the counterexample. If you can, it's false. If an unfamiliar name is two real names stuck together, it's invented.

① Spring Core 5 misses · 20 questions · 75%

Q34 · What SpEL is ticked a false option

SpEL queries and manipulates an object graph at runtime

You ticked "supports querying — manipulation of objects is not allowed". Single answer. SpEL writes as well as reads.

The correct option is the first sentence of the SpEL chapter in the Spring reference: "a powerful expression language that supports querying and manipulating an object graph at runtime". Each "only" option simply deletes half of that sentence.

ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext ctx = new StandardEvaluationContext(inventor);

String name = parser.parseExpression("name").getValue(ctx, String.class);  // query
parser.parseExpression("name").setValue(ctx, "Nikola Tesla");               // manipulate
parser.parseExpression("name = 'Nikola Tesla'").getValue(ctx);              // manipulate, with =

The fourth option is false too. SpEL doesn't replace Java or Kotlin. It's an expression language you use from Java: in @Value("#{…}"), in @PreAuthorize, in @Cacheable(key = "#id"), and on its own through SpelExpressionParser, with no ApplicationContext at all.

Memory hook: SpEL = query + manipulate. getValue() reads, setValue() writes. An option that allows "only" one of them is half the definition.
Q45 · @After advice stopped short review #3 · Q12 & Q13

Four of five were true — and three of them say the same thing

No false option ticked, so you left out at least one of the four true ones. You correctly rejected "@After prevents the target method executing".

Put the true options side by side: "runs whether the method completes or throws", "is like a finally block", "suitable for cleanup". That's one fact written three ways. Options that restate each other stand or fall together, so once one is true, take them all.

AdviceRuns whenSees return valueSees exceptionCan stop the target
@BeforeBefore the methodNoNoOnly by throwing
@AfterReturningAfter a normal returnYes — returning=NoNo
@AfterThrowingAfter an exceptionNoYes — throwing=No
@AfterAlways — the finallyNoNoNo
@AroundAround the callYesYesYes — skip proceed()

Review #3 said it in one line, and it still holds: "@After is the finally block: always runs, sees nothing."

Memory hook: @After = finally: always runs, sees nothing, stops nothing. Return value → @AfterReturning. Exception → @AfterThrowing. Change either → @Around.
Q46 · What ApplicationContext provides ticked a false option related · review #10 Q14

Read the capabilities off the six interfaces it extends — none of them is about passwords

You ticked "the ability to set password encryption". You correctly rejected "connect to databases", which is the same trap.
ApplicationContext extendsWhich gives it
ListableBeanFactoryBean factory methods — getBean, getBeansOfType
HierarchicalBeanFactoryParent contexts
MessageSourceMessage resolution, i18n
ApplicationEventPublisherPublishing events to listeners
ResourcePatternResolverLoading resources — classpath*:…
EnvironmentCapablegetEnvironment() — profiles and properties

Both false options are jobs a bean does: PasswordEncoder (Spring Security) and DataSource. Any bean can live in the context, so "the context can hold one" doesn't make it a capability of the context. If it isn't in the table, it's a bean's job.

Memory hook: ApplicationContext = BeanFactory + messages + events + resources + environment. Anything else belongs to a bean.
Q50 · The class in the transactional proxy invented name related · review #13 §tx

TransactionInterceptor — the advice that begins, commits and rolls back

You ticked TransactionStatusAdvice, which doesn't exist. You correctly rejected the other fake, PlatformTransactionManagerAdvisor, and TransactionTemplate.
StyleYou writeWhat does the work
Declarative@TransactionalTransactionInterceptor, inside the AOP proxy
ProgrammatictransactionTemplate.execute(status -> …)TransactionTemplate — no proxy
Programmatic, low levelgetTransaction() / commit() / rollback()PlatformTransactionManager + TransactionStatus

How the declarative pieces connect: @EnableTransactionManagement registers an advisor (BeanFactoryTransactionAttributeSourceAdvisor). Its pointcut matches @Transactional methods, and its advice is TransactionInterceptor, a MethodInterceptor. The interceptor asks the transaction manager to begin, calls proceed(), then commits or rolls back.

The tell for both fakes: each one glues two real names together — TransactionStatus + Advice, PlatformTransactionManager + Advisor. Real parts don't make a real class.

Memory hook: Declarative = TransactionInterceptor in a proxy. Programmatic = TransactionTemplate. A name made of two real class names is invented.
Q60 · Adding a bean definition ticked a false option 4th sitting · review #3 & #4

@Bean and <bean> add definitions; @ComponentScan only says where to look

You ticked @ComponentScan alongside the two correct options. Review #3 has a drill with these exact four options and this answer.

The test that settles it: point @ComponentScan at a package with no @Component classes. It registers zero beans. The definition comes from @Component (or @Service, @Repository, @Controller) on each class. Scanning only finds them. That's why the bank counts the stereotype, not the scan. new creates an object the container never sees.

Adds a bean definitionDoesn't
@Bean method in a @Configuration class@ComponentScan on its own
XML <bean>new
A scanned @Component-family class@Autowired — it uses beans, it doesn't define them
@Import(OtherConfig.class)
GenericApplicationContext.registerBean(…) · BeanDefinitionRegistryPostProcessor
Memory hook: A definition comes from a stereotype on the class, a @Bean method, or <bean>. @ComponentScan finds; it doesn't define.

② Spring Boot 4 misses · 12 questions · 67%

Q5 · Health indicator status ticked a false option Boot clinic §health

Custom statuses exist, the order is one property, and the default is DOWN → OUT_OF_SERVICE → UP → UNKNOWN

You ticked "the severity order cannot be changed due to security reasons". You correctly rejected both "least severity" and "last status in the list".
OptionVerdictWhy
Custom status values can be createdTrueHealth.status("FATAL") or new Status("FATAL")
The least severe status is the top-level statusFalseThe most severe wins
The order cannot be changed, for security reasonsFalsemanagement.endpoint.health.status.order
Built-in: DOWN, OUT_OF_SERVICE, UP, UNKNOWN, most severe firstTrueSimpleStatusAggregator's default order
The last status in a sorted list is usedFalseThe first one is. The sorted list is real; "last" is the lie

Adding a custom status end to end:

@Component
class DiskHealthIndicator implements HealthIndicator {
    public Health health() {
        return Health.status("FATAL").withDetail("disk", "corrupted").build();
    }
}
# 1. list it in the order, most severe first; the list replaces the default
management.endpoint.health.status.order=fatal,down,out-of-service,up,unknown
# 2. give it an HTTP code; an unmapped status returns 200
management.endpoint.health.status.http-mapping.fatal=503

Two traps outside the question. (1) A status that isn't in the order is ignored. The aggregator filters out unknown statuses before choosing, so if you forget step 1, a FATAL indicator leaves the endpoint UP. (2) The bank's explanation contradicts its own answer. Its prose lists UNKNOWN before UP, but the option it marks correct puts UP before UNKNOWN. So does Spring Boot's source. Trust the option.

Memory hook: Worst wins, first in the sorted list. Default DOWN > OUT_OF_SERVICE > UP > UNKNOWN. A custom status needs an order entry and an http-mapping.
Q10 · What Spring Boot is ticked a false option Boot clinic §packaging

Stand-alone, production-grade, opinionated — and "absolutely no code generation"

You ticked "Spring Boot does code generation using an opinionated approach". You correctly rejected "many requirements for XML configuration".

The option attaches a true word to a false claim. Opinionated is straight from the true option above it, and that's what made the sentence sound right. Rule the claim — does code generation — on its own. Boot's project page lists its goals, and one of them is literally "absolutely no code generation and no requirement for XML configuration".

What it does instead: auto-configuration creates beans at runtime from @Conditional classes that ship pre-compiled in spring-boot-autoconfigure. Nothing is ever written into your source tree. start.spring.io generates a project skeleton, but that's the Initializr, a separate tool, not Boot.

Memory hook: Boot = stand-alone + production-ready + opinionated starters + runtime auto-config. No code generation, no XML. The Initializr isn't Boot.
Q37 & Q53 · Fat jar vs original jar Q37 stopped short Q53 false option 4th & 5th time · #3, #11, Boot clinic

One topic missed in both directions on one paper — and Q37 answers Q53

Q37: no false option ticked, but you didn't take all three true ones. You rejected "the fat jar is smaller", the option that cost you on #11.
Q53: you ticked "both fat jar and original jar are executable". One of Q37's true options said "the fat jar is executable, the original jar is not".
Original jar — app.jar.originalFat jar — app.jar
Built bymaven-jar-pluginspring-boot-maven-plugin, repackage goal
ContainsYour classes and resources onlyYour classes + every dependency + the loader
java -jarNoYes
MANIFEST.MFNo Main-ClassMain-Class: …JarLauncher · Start-Class: your app
SizeSmallLarger — always
app.jar
├── META-INF/MANIFEST.MF          Main-Class: org.springframework.boot.loader.JarLauncher
│                                 Start-Class: com.example.App
├── BOOT-INF/classes/             your compiled code
├── BOOT-INF/lib/                 every dependency, as nested jars
└── org/springframework/boot/loader/   the launcher

Earlier options can answer later questions. Q37 came sixteen questions before Q53 and stated the fact outright. When a later option contradicts something you've already judged true, one of them has to be wrong.

Memory hook: Fat jar = original + every dependency + a launcher. Only the fat jar runs with java -jar. Main-Class = JarLauncher, Start-Class = your app. Made by spring-boot-maven-plugin.

③ Testing 3 misses · 11 questions · 73%, up from 33%

Q32 · JUnit 5 assertions ticked a false option

A failed assertion throws, and the test ends there — that's why assertAll exists

You ticked "if any assertion fails, the test continues to execute the remaining assertions". You correctly rejected "use assertNull instead".

Every assertXxx method throws AssertionFailedError (from opentest4j) when it fails. An exception ends the method, so nothing after it runs. If assertions carried on after a failure, assertAll would have no reason to exist. It runs every lambda, collects the failures, and reports them together.

@Test
void createsUser() {
    User user = service.createUser("John", "Doe");
    assertNotNull(user, "User should not be null");   // fails → throws → test ends here

    assertAll("name",                                  // every lambda runs; all failures reported
        () -> assertEquals("John", user.getFirstName()),
        () -> assertEquals("Doe",  user.getLastName()));
}
OptionVerdict
assertEquals checks the first and last name matchTrue
Messages are optional and shown when an assertion failsTrue
assertEquals compares objects as well as primitivesTrue — overloads for primitives, equals() for objects
The test continues after a failed assertionFalse — it throws
assertNull should replace assertNotNullFalse — the user must exist

Two details this bank likes: in JUnit 5 the message is the last argument (JUnit 4 put it first), and it can be a Supplier<String>, so an expensive message is only built if the assertion fails.

Memory hook: Assertion fails → exception → test over. assertAll runs everything and reports every failure. The message goes last in JUnit 5.
Q33 · What spring-boot-starter-test leaves out ticked a false option review #1 · Q20 — same stem

JUnit 4 — the Vintage engine was dropped from the starter in Boot 2.4

You ticked "None of the mentioned". On #1 that was correct, because that list was JUnit 5, Spring Test and Mockito. This list included JUnit 4.
In the starter (Boot 2.4+)Not in it
JUnit 5 (Jupiter)JUnit 4 Vintage engine — removed in 2.4
Spring Test + Spring Boot TestPowerMock, EasyMock
AssertJ · HamcrestTestcontainers
MockitoYour database driver
JSONassert · JsonPath · XMLUnit
<!-- still running JUnit 4 tests? add the engine back yourself -->
<dependency>
  <groupId>org.junit.vintage</groupId>
  <artifactId>junit-vintage-engine</artifactId>
  <scope>test</scope>
</dependency>

Same stem, different options, different answer. "None of the mentioned" is only true if every item listed is actually included. Check each one before you reach for it. (In Boot 2.2 and 2.3 the Vintage engine was included. Your exam targets 2.5.)

Memory hook: Everything test-y is in; only JUnit 4 Vintage is out (since 2.4). Read the list before ticking "None of the mentioned".
Q44 · Keeping the real DataSource in @DataJpaTest invented name review #6 · Q35 — same fake

@AutoConfigureTestDatabase(replace = Replace.NONE) — @AutoConfigureDataSource still doesn't exist

You ticked @AutoConfigureDataSource(replace = Replace.NONE). On #6 you ticked it and replaceProdDb. This time you rejected replaceProdDb and replaceDb, so half of this is fixed.

How to find the real one: @DataJpaTest is meta-annotated with @AutoConfigureTestDatabase(replace = Replace.ANY). So the way to switch the replacement off is that same annotation, declared on your test class with a different value. @DataJpaTest has no attribute for it at all.

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class OrderRepositoryTest { … }
ReplaceBehaviour
ANY (default)Replace any DataSource — auto-configured or your own
AUTO_CONFIGUREDReplace only the auto-configured one
NONEKeep the configured DataSource

The same switch exists as a property, spring.test.database.replace=none. And @JdbcTest carries the same meta-annotation, so the same fix works there too.

Memory hook: The annotation that replaces the database is the one that stops it: @AutoConfigureTestDatabase(replace = NONE). The real name has Test in it.

④ Spring MVC 1 miss · 89%

Q28 · True about Spring MVC controllers stopped short review #13 · Q29 — same question, same miss

Three of four were true — the false one is "every path must share a prefix"

No false option ticked, so you left out at least one true one. On #13 this question had all four options true, and you stopped short then too.
OptionVerdictWhy
@Controller is a stereotype annotationTrueMeta-annotated with @Component, so scanning finds it
No direct dependency on Servlet or Portlet APIsTrueThe older Spring reference's own words. You can take HttpServletRequest as a parameter; you don't have to
No specific class or interface inheritance requiredTrueNo AbstractController, no Controller interface
All endpoint paths must share the same prefixFalseA class-level @RequestMapping is optional

This is the "one false option" shape again. The false option doesn't sound like the other three. Once you've rejected it, nothing is left to reject, so take everything else. Stopping at two out of caution costs exactly as much as a wrong tick.

Memory hook: Annotated controllers: a stereotype, no base class, no Servlet API dependency. The class-level @RequestMapping prefix is optional.

⑤ Spring Security 1 miss · 1 of 2 questions

Q13 · Enabling @Secured ticked a false option 4th sitting · Security clinic §method

securedEnabled switches on @Secured — prePostEnabled never does

You ticked @EnableMethodSecurity(prePostEnabled = true). The Security clinic notes this topic was "asked three times, missed three times". This makes four.
AttributeSwitches onDefault — 5.x @EnableGlobalMethodSecurityDefault — 6 @EnableMethodSecurity
prePostEnabled@PreAuthorize · @PostAuthorize · @PreFilter · @PostFilterfalsetrue
securedEnabled@Securedfalsefalse
jsr250Enabled@RolesAllowed · @PermitAll · @DenyAllfalsefalse

The name gives it away: each attribute is named after the annotations it enables. secured → @Secured, jsr250 → the JSR-250 annotations, prePost → @Pre…/@Post…. The correct option also set jsr250Enabled = true; switching on a second family does no harm.

Version note: the question uses @EnableMethodSecurity (Security 5.6+). On a 5.x-era exam you're more likely to see @EnableGlobalMethodSecurity(securedEnabled = true). The attribute names are the same.

Memory hook: The attribute is named after the annotation. securedEnabled → @Secured. prePostEnabled → @Pre/@Post. jsr250Enabled → @RolesAllowed.

The 14 facts, one line each

Drill these, don't read them

Mixed drill — all sections, no headings

Eleven questions with no topic label to prime you. For every option with cannot, only, both, none or a name you can't place, say the counterexample out loud before you tick.

The change to make before the next attempt (1) Keep the routine exactly. 60/60 answered, false ticks down from 17 to 11, and a pass. Don't change what worked. (2) Use the spare time for one targeted second pass. You finished with 77 minutes left. Go back only to options containing cannot / not allowed / only / both / none / always and name the counterexample. On this paper that's five marks. (3) Re-drill the eight same-question repeats. Q28 and Q44 are the clearest cases: the same question you missed before, missed the same way. (4) Read the options, not your memory of the answer. Q33 had #1's stem with a different list, and a different answer. (5) Aim for 48+. 46 passes by one question. 48 gives you two spare.
A 30-minute routine before the next paper 5 min — the counterexample drill. Eleven statements from this paper. This is the five marks. 10 min — Spring Boot above, then the Boot clinic's packaging section. Fat jars have now come up on five papers. 10 min — Spring Core above. 20 questions this time, 5 misses, and still the one section with no clinic. 5 min — the mixed drill. No headings, every section.
I'm your teacher — ask me anything. Say "drill the repeats" for a set built from every question you've now missed more than once across all fifteen papers, or "quiz me on the 14" for this attempt. Spring Core is still the only section without a clinic, and it was 20 of these 60 questions. Say "build the Core clinic" and I'll make it from every Core miss in the series.
← Dashboard ← Review #14 Boot clinic Testing clinic Security clinic