Exam Drill #19 · 1 Oct 2026 · 11 to fix · 61 drills

Nineteenth attempt — back over the line, and Core is fixed

49/60 = 82%, against a 76% pass mark. That is three marks clear, and +5 on #18. Spring Core went 61% → 91%, the biggest single-section recovery the site has recorded, and it was the section #18's routine gave the most minutes to. You also finished in 40m 53s, half the time of #18.
What's left is small and familiar. Three questions where you ticked nothing false and stopped short (the fifth paper running), two questions answered identically wrong to attempt #14, and a Testing section that fell to 40%.

82%
Pass mark 76% ✓
+5
Marks on #18 (44 → 49)
11
Misses — was 16
+3
Marks clear of the pass
4 / 5
Of the last five papers passed
Progress · every attempt

Nineteen papers, out of 60

Hover a bar for the date and score. The dashed line is 46/60, the lowest pass.

Passed (46+) Below the pass

The first fourteen papers averaged 40.3. The last five average 47.8. Attempts #15 to #19 are a different level, not a lucky run. #18 is the only dip, and it came from a single section that the next routine fixed.

Official result · practice exam

82% — passed

76% required to pass · 60/60 answered · 49 correct · time used 40m 53s of 2h 10m
Data Management 92%▲ 31 miss / 12–13 Spring Core 91%▲ 302 misses / 22–23 Spring MVC 80%▬ 01 miss / 5 Spring Boot 77%▼ 83 misses / 13 Spring Security 50%▼ 501 miss / 2 Testing 40%▼ 173 misses / 5

How the sizes come out. MVC 4/5 = 80%, Security 1/2 = 50% and Boot 10/13 = 76.9% are forced. Testing at 40% only works as 2/5, which means three Testing misses, so Q8 (the @TestPropertySource question) was filed under Testing, not Boot. Core and Data share the remaining 35 questions, and both 20/22 + 12/13 and 21/23 + 11/12 give 91% and 92%. Either way Core is still over a third of the paper.
Security's 50% is one question out of two. It is noise in the percentage, but it's still a real fact you got wrong, so it gets its own small block below.

Where the next marks are

You passed by three. The cushion you want on the real exam is bigger than that. It's already on this page:

If you had…ScoreResult
Taken every true option on Q3, Q19, Q235287%
…and not repeated #14's Q2 answer, and the SpEL list from #45490%
What actually happened4982% — passed

Five of the eleven misses needed no new knowledge. Three were stopping short, and two were the same answer you gave on an earlier paper.

What moved between #18 and #19

Attempt #18Attempt #19Result
Score44/60 (73%)49/60 (82%)+5 · passed
Misses1611−5
Questions with a false tick138−5
Stopped short (no false tick)33Unchanged — fifth paper running
Left blank00Held — seventh paper running
Spring Core misses92−7
Testing + Security misses34+1
Time1h 14m 45s40m 53s−34 min, and +5 marks

The routine worked exactly where it was weighted. #18's routine gave Core 12 minutes and Core gained seven marks. Testing got 5 minutes and Security 2, and those two are now the lowest percentages on the paper.

Fourth paper running: whatever got the minutes goes up

Section#17#18#19Minutes in #18's routine
Spring Core96%61%91%12 — the most
Data Management70%89%92%3 (with MVC)
Spring MVC71%80%80%3 (with Data)
Spring Boot89%85%77%5
Spring Security100%100%50%2
Testing75%57%40%5

Testing has fallen three papers in a row: 75 → 57 → 40. It is only five questions, but that's five questions at 40% when every other section sits at 77% or better. The Testing clinic exists. This page's Testing block is the longest one for that reason, and the routine at the bottom gives Testing more time than #18's did. Core keeps its 12 minutes because it's 22–23 questions of the paper, even at 91%.

Four of the eleven were already on this site

QTopicAlready on this siteThen → now
Q2When BeanPostProcessor runs#14 Q29: word-for-word the same questionTicked "only once" both times
Q19What goes in Actuator info#14 Q35: word-for-word the same question, plus the Boot clinicStopped short of the four true options both times
Q24What SpEL compiled mode can't compileAttempt #4 (18 Aug): same question, same six optionsMissed then, missed now — this time with a false tick on "constructors"
Q3Fat jar statements#3, #11 and #15 (review) — different wording, same factsFourth fat-jar miss

Q2 and Q19 are the ones to sit with. Three weeks apart, the identical question got the identical wrong answer. The #14 review explained both. Reading an explanation once didn't change what you clicked. Answering the drill again a few days later is what does. That's why the progress panel below records your scores. Come back to this page before #20 and beat your own numbers.

My drill progress on this page

Each time you finish a drill block (every question answered), it's recorded here in this browser. Reload the page to retake a block. Questions and options reshuffle every time. Aim for a full score on every block before the next paper.

Drill blockQsLastBestRunsLast done
Loading…

All 11, at a glance

QTopicWhat went wrongThe answer
Q2When BPP runs+ "only once" — same as #14Twice per bean, around the init callbacks
Q3Fat jar statementsStopped short — 3 were trueExecutable · built by default · code + all dependencies
Q8Highest-precedence property source+ OS environment variables@TestPropertySource
Q14application.properties search order+ the reversed order./config/ → ./ → classpath:/config/ → classpath:/
Q15JdbcTemplate inside a transaction+ "False"True — one connection, bound to the thread
Q19Actuator info contentsStopped short — 4 were true, same as #14Version · git hash · description · name
Q20@DataJpaTest auto-config+ JSR-303 bean validationJdbcTemplate · TestEntityManager
Q23Which are HTTP methodsStopped short — 3 were trueGET · OPTIONS · PUT
Q24SpEL compiled mode limits+ "constructors"Assignment · custom resolvers · conversion service · selection/projection
Q34jsr250Enabled = true+ "All of the above"@RolesAllowed only
Q50Spring integration tests+ "config file has to be provided"Config can be inherited from a superclass

A note on what you ticked

The exported results show an icon instead of a letter for any option that was correct or ticked. So a no-letter option marked "Incorrect" is a definite false tick, but on a single-answer miss there's no way to tell whether you also ticked the right one. On Q3, Q19 and Q23 there is no false tick anywhere, so those can only be under-selection. On Q24 there was a false tick ("constructors"), and you may also have left a true option unticked.

Jump to a section

⓪ Stopped short + repeats — 8 drills ① Testing — 3 misses (40%) · 10 drills ② Spring Boot — 3 misses (77%) · 9 drills ③ Spring Core — 2 misses (91%) · 9 drills ④ Spring Security — 1 miss (50%) · 5 drills ⑤ Data Management — 1 miss (92%) · 5 drills ⑥ Spring MVC — 1 miss (80%) · 4 drills Every hook on one screen Mixed drill — all sections, no headings · 11 drills

⓪ Stopped short, and the repeats 5 of the 11 misses

Shape 1 · Q3, Q19, Q23 stopped short

No false tick on any of the three — still three marks

Fifth paper in a row with this shape: #16 had three, #17 two, #18 three, and now three again. Every time, what you ticked was right, and you stopped before ticking everything that was true.

QOptionsTrueWhat they were
Q343Fat jar is executable · Boot builds one by default · code + all dependencies
Q1964Version · git commit hash · description · name (only the two passwords were false)
Q2343GET · OPTIONS · PUT (only SUBMIT was false)

Notice how many were true. 3 of 4, 4 of 6, 3 of 4. On this exam engine, a multi-answer question very often has only one false option. If you've rejected one option and the others all check out, that's normal. It isn't a sign you've ticked too many.

Memory hook: Judge each option alone, T or F. Then tick every T. Don't decide in advance how many answers there "should" be.
Shape 2 · Q2, Q19, Q24 same question, earlier paper

Three questions you have now sat twice

Q2 and Q19 are word-for-word #14's Q29 and Q35, three weeks ago, with the same answers. Q24 is attempt #4's SpEL question, six weeks ago. The practice bank repeats questions. Every miss on this page is likely to come back, so the drills here are worth more than new material.

Memory hook: A question you have missed once is the most likely question on the next paper.

① Testing 3 misses · 5 questions · 40%, down from 57%

Three papers running, Testing has dropped: 75 → 57 → 40. The three misses this time are all one idea: what a Spring test does for you without being asked. Which property source wins, what @DataJpaTest sets up, and what @ContextConfiguration needs.

Q8 · Highest-precedence property source ticked a false option

In a test, @TestPropertySource beats everything on that list

You ticked OS environment variables. You correctly rejected default properties and profile-specific files.

The Boot property order, lowest → highest (the exam-relevant rows):

#Source
1Default properties — SpringApplication.setDefaultProperties
2@PropertySource on a @Configuration class
3Config data — application.properties, then profile-specific, inside then outside the jar
5OS environment variables ← what you ticked
6Java system properties (-Dx=y)
11Command-line arguments (--x=y)
12properties attribute on @SpringBootTest
13@TestPropertySource ← the answer
14Devtools global settings (~/.config/spring-boot)

Why it has to be this way: a test has to be able to override the machine it runs on. If an environment variable on the CI box could beat @TestPropertySource, your test would pass on your laptop and fail in CI.

Memory hook: Test annotations sit at the top. The test must be able to beat the machine it runs on.
Q20 · What @DataJpaTest auto-configures ticked a false option

A JPA slice: the persistence layer and nothing else

You ticked JSR-303 bean validation. You correctly rejected caching.
In the @DataJpaTest sliceNot in it
An embedded database, replacing your DataSource@Service, @Controller, @Component beans
Hibernate / JPA, entity scanning, Spring Data repositoriesWeb layer, MockMvc
JdbcTemplateCaching
TestEntityManagerBean Validation auto-configuration
@Transactional, with rollback after each testSecurity

Why validation is tempting: Hibernate will validate entities on persist if a validator is on the classpath. But that is Hibernate's own behaviour, not something the test slice configures. The question asks what the slice auto-configures.

One correction to the exam's own explanation: it says Flyway and Liquibase are not part of the slice. In Boot they are included in @AutoConfigureDataJpa, so migrations run against the test database if the library is on the classpath. That isn't what this question tests, but don't learn the wrong version from the explanation text.

Memory hook: @DataJpaTest = DB + JPA + repositories + the two templates (JdbcTemplate, TestEntityManager) + rollback.
Q50 · Spring integration tests a stricter rule than Spring has

"Has to be provided" — no, it doesn't

You ticked "The Spring context configuration file has to be provided to @ContextConfiguration". You correctly rejected "a new context per test class" and "you must call getBean()".

This is #18's "invented strictness" shape again: "must be public", "must be @Configuration", and now "has to be provided". @ContextConfiguration with no attributes falls back to a default:

With no classes or locationsSpring looks for…
Annotation configA static nested @Configuration class inside the test class
XML configclasspath:com/example/MyTest-context.xml — named after the test class
Superclass has @ContextConfigurationIt's inherited (inheritLocations = true by default) — the true answer
@SpringBootTestSearches upward for the @SpringBootConfiguration class
Memory hook: "Has to", "must", "always" in an option about Spring config = suspicious. Spring has a default for almost everything.

② Spring Boot 3 misses · 13 questions · 77%, down from 85%

Q14 · Where Boot looks for application.properties ticked a false option

You ticked the right order, backwards

You ticked classpath root → /config sub-directory → working directory → config package, which is close to lowest-first. The question said highest to lowest.
PriorityLocationWhy
1 (highest)file:./config/ (and ./config/*/ since 2.4)Outside the jar, in the config folder
2file:./Outside the jar
3classpath:/config/Inside the jar, config package
4 (lowest)classpath:/Inside the jar, root

Two rules make the whole order: (1) outside the jar beats inside. Operations must be able to override what developers packaged. (2) A config folder beats the plain root, in both places.

Memory hook: Outside beats inside; config/ beats root. Then read the question's direction twice: "highest to lowest" or "lowest to highest"?
Q3 · Fat jar stopped short 4th fat-jar miss

Three of four were true

Statement
Fat jar is executableTRUE — java -jar app.jar via JarLauncher
Spring Boot creates a fat jar by defaultTRUE — the Boot Maven/Gradle plugin's repackage / bootJar
Contains your code and all dependenciesTRUE — BOOT-INF/classes/ + BOOT-INF/lib/
Contains only your compiled codeFALSE — that's the original thin jar (kept as *.jar.original)

Don't let the typos put you off. Option D read "Fat jar container the complied code". Badly written options are still true options. Judge the claim, not the spelling.

Memory hook: Fat jar = executable + by default + everything inside. Only "only your code" is false.
Q19 · Actuator info stopped short same as #14 Q35

Anything that describes the build is fine; nothing secret

Four of six were true: version, git commit hash, description, name. Only the two passwords were false. You stopped short on this exact question on #14 too.

ContributorSourceJSON key
EnvironmentInfoContributorAny info.* property (off by default since Boot 2.6: management.info.env.enabled=true)app.name, app.version…
GitInfoContributorgit.properties on the classpathgit
BuildInfoContributorMETA-INF/build-info.propertiesbuild
Memory hook: /info is public metadata: name, description, version, git. Never a secret.

③ Spring Core 2 misses · 22–23 questions · 91%, up from 61%

This is the recovery. Nine misses on #18, two on #19. Both of the two are repeats, and neither is deep. Keep Core in the routine anyway. It's the biggest section, and #17 → #18 showed how fast it drops when it's left out.

Q2 · When BeanPostProcessor runs ticked a false option same as #14 Q29

Twice per bean, around the init callbacks

You ticked "Only once — after beans are instantiated but before initialization callbacks", the same option as on #14.
StepFor one bean
1Constructor → instance exists
2Dependency injection
3*Aware setters
4postProcessBeforeInitialization ← hook #1
5@PostConstruct → afterPropertiesSet → init-method
6postProcessAfterInitialization ← hook #2, AOP proxies made here

Where the wrong options come from. "After the context is created but before any bean is created" describes a BeanFactoryPostProcessor. That runs once, on bean definitions. "Only once" leaves out hook #2, and hook #2 is where proxies are made. Without it, @Transactional couldn't work. "Three times, including destruction" mixes in DestructionAwareBeanPostProcessor, which is a separate sub-interface.

Memory hook: BPP = two hooks per bean, either side of init. The proxy comes from the after hook. "Once, before any bean" is the Factory post-processor.
Q24 · What SpEL compiled mode can't compile ticked a false option attempt #4

Four things block compilation; constructors aren't one of them

You ticked "Expressions relying on constructors".
Not compilable (the documented list)Compiles fine
Assignment — name = 'x'Operators — + - * / == <
Relying on the conversion serviceConstructors — new com.acme.Foo()
Custom resolvers or accessorsProperty access, method calls, literals
Selection .?[…] / projection .![…]

The pattern: the compiler can only turn an expression into bytecode if it knows the exact types in advance. Assignment changes state, the conversion service and custom resolvers are decided at runtime, and selection/projection build collections on the fly. A constructor call has a fixed type, so it compiles.

Modes: OFF (default) · IMMEDIATE (compile ASAP, a later failure throws) · MIXED (silently falls back to interpreted). An expression that can't be compiled just stays interpreted. There's no error.

Memory hook: SpEL won't compile "A-C-C-S": Assignment, Conversion service, Custom resolvers, Selection/projection.

④ Spring Security 1 miss · 2 questions · 50%, from 100%

Q34 · jsr250Enabled = true ticked a false option

Three flags, three annotation families

You ticked "All of the above".
FlagEnablesOrigin
prePostEnabled = true@PreAuthorize · @PostAuthorize · @PreFilter · @PostFilterSpring, SpEL-based
securedEnabled = true@SecuredSpring, roles only
jsr250Enabled = true@RolesAllowed · @PermitAll · @DenyAllJava standard (JSR-250)

Telling them apart: JSR-250 is the Java standard, so its annotations live in javax.annotation.security, not in a Spring package. @Secured is in Spring's own package even though it looks just as plain.

Since Spring Security 5.6, @EnableMethodSecurity replaces @EnableGlobalMethodSecurity and turns prePostEnabled on by default. The other two are still opt-in.

Memory hook: "All of the above" on a single-flag question is almost always the trap. One flag → one family.

⑤ Data Management 1 miss · 12–13 questions · 92%

Q15 · JdbcTemplate inside a transaction ticked a false option

True: one connection for the whole transaction

You ticked False. The odd wording ("reused until available") probably made a true statement look wrong.
MomentWhat happens
Transaction startsDataSourceTransactionManager gets a connection, sets autoCommit=false, binds it to the thread (TransactionSynchronizationManager)
Each JdbcTemplate callDataSourceUtils.getConnection(ds) finds the bound connection and reuses it
Commit / rollbackThe connection is committed or rolled back, unbound, and returned to the pool
No transactionEach call borrows its own connection and auto-commits

The consequence that gets examined: the binding is per thread. Start a new thread inside a @Transactional method and its JdbcTemplate calls run outside the transaction.

Memory hook: Transaction = one connection, parked on the thread. Every template call in it picks up that same connection.

⑥ Spring MVC 1 miss · 5 questions · 80%

Q23 · Which are HTTP methods stopped short

Three of four were real

No false tick, so you left out a real method. OPTIONS is the usual one people leave out. It's what a browser sends for a CORS preflight.

MethodSafeIdempotent
GET · HEAD · OPTIONS · TRACEyesyes
PUT · DELETEnoyes
POST · PATCHnono
SUBMIT · FETCH · SEND❌ not HTTP methods
Memory hook: Nine real verbs: GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE, CONNECT. Anything else is invented.

Every hook on one screen

The eleven facts, in one pass

Mixed drill — all sections, no headings

Eleven questions with no topic label to prime you. Judge each option on its own, then tick every true one.

The change to make before the next attempt (1) Keep the routine. It worked: Core +30 points in one paper. Don't drop it now you've passed again. (2) Give Testing more time. It has fallen three papers running. It's now 8 minutes below, not 5. (3) Take every true option. Q3, Q19 and Q23 had no false tick. That's three marks, five papers running. (4) Read the direction. Q14 asked highest → lowest and you ticked the reverse. (5) Distrust "has to", "must" and "all of the above". Q50 and Q34. (6) Redo this page's drills in a few days. Q2 and Q19 show that reading an explanation once isn't enough.
A 37-minute routine before the next paper — all six sections, weighted 10 min — Spring Core. This page's nine drills, then #18's fourteen. Core is 22–23 of 60. Keep it non-negotiable. 8 min — Testing. Ten drills, then the Testing clinic. It's fallen three papers running. 5 min — stopped short + repeats. Eight drills, all exact paper questions. 5 min — Spring Boot. Nine drills: config locations, fat jar, info. 3 min — Security. Five drills. One question on the paper, but don't give it away. 3 min — Data + MVC. Nine drills. Both healthy. 3 min — the mixed drill. No headings, so nothing primes you.
Then check your progress panel. Every block at full marks before you sit #20.
I'm your teacher — ask me anything. Say "drill the repeats" for a set built from every question you have missed on more than one paper. Q2 and Q19 have now joined #18's list. Or "build the Spring Core clinic". Core recovered, but it's still the only section without its own clinic page. Or "Testing round 2" for a fresh Testing set, since that's now the lowest section.
← Dashboard ← Review #18 Review #14 (Q2 / Q19 first time) Testing clinic Boot clinic Core internals drill