Exam Review #5 · 19 Aug 2026 · 18 to fix

Fifth attempt — 70%, and a very useful failure

You scored 42 / 60 = 70% — your second-best result, one mark off attempt #4. Pass is 76% (46/60), so you need +4. But the headline number hides the real finding: Data Management fell from 91% to 36% in a single day, and it alone accounts for 7 of your 18 misses. Nothing about your knowledge collapsed overnight — this paper simply asked the transaction and repository questions that reviews #1 and #2 covered and you haven't revisited since. That's the lesson of this attempt: your revision decays.

70%
This attempt (42/60)
72%
Attempt #4 (43/60)
76%
Pass mark (46/60)
+4
Questions to pass
Official result · practice exam

70% — you did not pass this time

76% required to pass · 60/60 answered · 42 correct · time used 44m 58s of 2h 10m
Spring Boot 92%▲ 141 miss Testing 88%▲ 151 miss Spring Core 71%▲ 96 misses Spring MVC 67%▲ 101 miss Spring Security 60%▼ 402 misses Data Management 36%▼ 557 misses

How to read this. Four of six sections went up, and Spring Boot (92%) and Testing (88%) are now genuinely safe — those are done, stop revising them. Everything that went wrong is in two places: Data Management at 36% (7 misses — transactions, ACID, JdbcTemplate, derived queries) and Spring Security at 60% (2 misses). Note also that 4 of the 6 "Spring Core" misses are AOP, which the report hides inside a section you scored 71% on — AOP is a genuine weak spot masquerading as a decent score.
And the clock, third attempt running. 44m 58s of 2h 10m — you used 35% of your time, faster again (74 → 51 → 45 minutes). That's 45 seconds per question with 85 minutes left on the table, while still losing 5 marks to unticked correct options. This is now the most stubborn pattern in the whole series.

Section scores across the last three attempts

The single most useful table in this review — it shows which topics stay fixed and which decay.

Section#3 · 17 Aug#4 · 18 Aug#5 · 19 AugVerdict
Spring Boot45%78%92%Fixed — climbed every attempt
Testing83%73%88%Solid
Spring Core68%62%71%Stuck around 70 — AOP is the drag
Spring MVC60%57%67%Improving slowly
Spring Security33%100%60%Volatile — spikes then decays
Data Management60%91%36%Volatile — worst swing in the series
What this actually proves. Spring Boot is the one section you revised and then kept revisiting — it went 45 → 78 → 92 and never came back down. Security and Data each hit a peak the day after their review and then fell off a cliff. So the reviews work, but a single pass buys you roughly one exam's worth of retention. The fix isn't new material — it's re-covering all five checklists before each attempt. Your five reviews now hold 99 corrected facts; that list is the syllabus you keep being tested on.
Your three failure modes this time — 18 misses, only ~11 of them knowledge

The 18 questions you failed

Your answer is reconstructed from the exported result — if a line looks wrong, tell me and I'll fix it. Click the topic to jump to the full explanation.

QTopicWhat you answeredThe answer
Q5Spring AOP statements"Spring AOP can apply aspects at compile time"Cross-cutting concerns · can't proxy final methods · JDK proxies by default
Q10Managing bean scopes"Use singleton for all beans to simplify configuration"Use the appropriate scope for the bean's lifecycle and usage
Q16"A point during execution""Advice"Join point
Q21AOP advice statements"proceed() must be called up to 1 time only"First param of @Around is ProceedingJoinPoint · @AfterThrowing's throwing filters by exception type
Q22@Transactional properties"rollback"rollbackForClassName, noRollbackFor, noRollbackForClassName
Q28ACID — "as if alone in the system""Atomicity"Isolation
Q30DataSource for test/dev"DriverManagerDataSource"EmbeddedDatabaseBuilder
Q35Deserialising the request body"@RequestMapping"@RequestBody
Q36@EnableGlobalMethodSecurity"Configures global settings for securing web endpoints/URLs"Enables method-level security
Q38Spring Data comparison keywordsUnder-selected — all four were validLike, Is, Between, GreaterThan
Q39@annotation(CustomTransaction)"Nothing, the pointcut expression is incorrect"Matches methods annotated with @CustomTransaction
Q40Supported transaction APIsUnder-selected — missed one of the threeHibernate, JTA, JPA (+JDBC) — not JDO
Q45Excluding test auto-configuration"Use @ContextConfiguration instead of @SpringBootTest"The exclude attribute of @ImportAutoConfiguration
Q46JdbcTemplate exception translation"True"False — it translates to DataAccessException, not SQLException
Q52Prototype-scoped beansUnder-selected — missed one of the twoCreated on demand each request · created eagerly when injected into a singleton
Q53Spring Security statements"permitAll() bypasses Spring Security completely"Auth data from DB/LDAP/etc · access control at method level
Q54What derived queries generateUnder-selected — missed one of the threeWHERE conditions · result limit · ordering (never PL/SQL)
Q59Exposing all Actuator endpointsUnder-selected — missed one of the twomanagement.endpoints.web.exposure.include=* · management.endpoints.enabled-by-default=true
Four of these you have already been taught in an earlier review Q40 transaction APIs / JDO — review #2 · Q46 DataAccessException — review #1 · Q59 Actuator exposure — review #2 · Q35 @RequestBody — review #3. That's 4 free marks — more than the 4 you need to pass — sitting in checklists you've already written. Re-covering the old lists is now worth more than learning anything new.

Jump to a section

① Data Management — 7 misses ② AOP — 4 misses ③ Beans & scopes — 2 misses ④ Spring Security — 2 misses ⑤ Boot & Testing — 2 misses ⑥ Spring MVC — 1 miss

① Data Management 7 misses

91% yesterday, 36% today. This is the section to rebuild end-to-end — and three of the seven are facts from earlier reviews.

Q22 · @Transactional properties

There is no rollback attribute — it's rollbackFor and friends

Your answer: you ticked "rollback", which doesn't exist. The four real rollback attributes all carry a For.

The rollback family is exactly four names — rollbackFor (classes), rollbackForClassName (strings), noRollbackFor, noRollbackForClassName. The full attribute list is worth knowing cold, because "which of these is not an attribute" is a stock question:

AttributeTakesDefault
propagationPropagation enumREQUIRED
isolationIsolation enumDEFAULT (the datastore's)
timeoutint seconds-1 (none)
readOnlybooleanfalse
rollbackFor / rollbackForClassNameclasses / strings
noRollbackFor / noRollbackForClassNameclasses / strings
transactionManager (alias value)bean namethe primary one

The default rule that everything hangs off: unchecked exceptions (RuntimeException, Error) roll back; checked exceptions do not — you must name them in rollbackFor. And remember from review #2 that @Transactional doesn't support SpEL, so these are all fixed types.

Memory hook: Every rollback attribute contains "For". Unchecked rolls back, checked doesn't.
Q28 · ACID — "as if it were the only transaction"

Isolation, not atomicity

Your answer: "Atomicity"that's all-or-nothing; running as if alone is Isolation.

Pin the four to a one-word trigger each:

PropertyTrigger words in a questionGuarantee
Atomicity"all or nothing", "partial"every operation commits, or none does
Consistency"valid state", "constraints", "invariants"rules hold before and after
Isolation"concurrent", "as if alone", "interference"concurrent transactions don't see each other's work
Durability"crash", "persists", "committed"committed data survives failure

Isolation is also the only one you configure in Spring — @Transactional(isolation = Isolation.REPEATABLE_READ). Know the level/anomaly grid:

LevelDirty readNon-repeatable readPhantom read
READ_UNCOMMITTEDpossiblepossiblepossible
READ_COMMITTEDpreventedpossiblepossible
REPEATABLE_READpreventedpreventedpossible
SERIALIZABLEpreventedpreventedprevented
Memory hook: "Concurrent" or "as if alone" ⇒ Isolation. It's also the only ACID letter with a Spring setting.
Q30 · A DataSource for tests and development

EmbeddedDatabaseBuilder — it creates the database; the others just connect

Your answer: "DriverManagerDataSource"that points at an existing external database with no pooling. The test/dev answer stands a database up for you.

new EmbeddedDatabaseBuilder().setType(H2).addScript("classpath:schema.sql") .addScript("classpath:test-data.sql").build() launches an in-process H2/HSQLDB/Derby and runs your scripts — ephemeral, isolated, reset by dropping the bean. That's what makes it the dev/test answer.

TypeWhat it isUse
EmbeddedDatabaseBuilderstands up an in-memory DB + runs scriptstests / development
DriverManagerDataSourcewraps DriverManager.getConnection(), no pool (review #3)quick scripts against a real DB
SingleConnectionDataSourcereuses one physical connectionspecial-purpose adapter
SmartDataSourcean interface (shouldClose()), not a creation routeimplemented by adapters

Boot ties in automatically: with no configured DataSource and H2/HSQLDB/Derby on the classpath it auto-creates an embedded DB, seeded via spring.sql.init.schema-locations/data-locations. Production is still HikariCP.

Memory hook: Embedded = builds the DB. DriverManager = dials an existing one. Single/Smart = adapters.
Q38 · Spring Data comparison keywords all options correct

Like, Is, Between, GreaterThan — every one is valid

Your answer: under-selected. There was no wrong option to avoid — the third "all of them" question in two attempts.

The keyword vocabulary, which also answers Q54 below:

KeywordSQL / JPQL
Is / Equals / (nothing)x = ?
Notx <> ?
LessThan / GreaterThan (+Equal)x < ? / x > ?
Betweenx BETWEEN ? AND ?
Like / StartingWith / EndingWith / Containingx LIKE ? / ?% / %? / %?%
In / NotInx IN (?)
IsNull / IsNotNullx IS [NOT] NULL
True / False / IgnoreCaseboolean tests / UPPER(x) = UPPER(?)
Memory hook: If it reads like SQL in English, Spring Data supports it. Reject only invented or vendor-specific names.
Q40 · Supported transaction APIs taught in review #2

JDBC, JPA, Hibernate, JTA — JDO was removed in Spring 5

Your answer: under-selected — you correctly rejected JDO but didn't tick all three valid APIs. This exact fact is in your review #2 checklist.

Spring's PlatformTransactionManager abstraction has one implementation per API:

APITransaction manager
JDBCDataSourceTransactionManager
JPAJpaTransactionManager
Hibernate (native)HibernateTransactionManager
JTA (distributed / global)JtaTransactionManager
JDOremoved in Spring Framework 5.0org.springframework.orm.jdo is gone

Pair it with review #2's other fact: one resource = local transaction; multiple resources = global/JTA.

Memory hook: JDBC · JPA · Hibernate · JTA. JDO is dead — Spring 5 deleted it.
Q46 · JdbcTemplate exception translation taught in review #1

False. It translates to DataAccessException, not to a "richer SQLException hierarchy"

Your answer: Truethe statement is false; the target hierarchy is Spring's own DataAccessException.

The whole point of the translation is to get you away from SQLException: JdbcTemplate catches the vendor's checked SQLException and rethrows it as an unchecked DataAccessException, so callers never have to catch or declare it and your code is independent of JDBC/JPA/Hibernate.

SQLException  (checked, vendor-specific error codes)
   → DataAccessException  (UNCHECKED — the root)
       ├── DataIntegrityViolationException
       ├── DuplicateKeyException
       ├── EmptyResultDataAccessException
       └── IncorrectResultSizeDataAccessException

Watch for this exact bait wording: any option claiming translation into "a more informative SQLException hierarchy" is false. @Repository is what enables the same translation for non-JdbcTemplate DAOs.

Memory hook: SQLException goes IN, DataAccessException comes OUT — unchecked, one root, Spring's own.
Q54 · What a derived query name generates

WHERE conditions, a result limit, and ordering — never vendor SQL

Your answer: under-selected — you missed one of the three. The only false option was "PL/SQL expression".

At startup, PartTree parses the method name into subject + predicate and compiles it to a JPA CriteriaQuery. Derivable from the name:

ElementKeywordExample
WHERE conditionsBy<Property><Op>findByAgeGreaterThan(int)
Logical joinAnd / OrfindByNameAndActive
LimitFirst<N> / Top<N>findTop10ByOrderByScoreDesc
OrderingOrderBy…Asc/DescfindByStatusOrderByCreatedDesc
DistinctDistinctfindDistinctByLastName
Operationcount/exists/deleteBycountByStatus

Not derivable: anything vendor-specific — PL/SQL, T-SQL, native functions. Spring Data is database-agnostic; for vendor SQL you need @Query(nativeQuery = true). And as review #4 noted, a bad property name throws PropertyReferenceException at startup.

Memory hook: Name gives you WHERE + LIMIT + ORDER BY. Never vendor SQL.

② AOP 4 misses

Reported inside "Spring Core 71%", but 4 of those 6 misses are AOP — and AOP also cost you 3 marks in attempt #3. It is your most persistent knowledge gap.

Q16 · "A point during execution — always a method execution"

That's a join point

Your answer: "Advice"advice is the action; the point itself is a join point.

Learn the five terms as a sentence: an aspect uses a pointcut to select join points, where it applies advice; the wiring-up is weaving.

TermDefinitionIn code
Join pointa point during execution — in Spring AOP always a method executionthe matched method call
Pointcuta predicate/expression selecting join pointsexecution(* svc.*.*(..))
Advicethe action taken at a join point@Before, @Around, …
Aspectthe module combining pointcuts + advicean @Aspect class
Weavingapplying aspects to targetsSpring = runtime proxies only
Target / Introductionthe advised object / adding new interfaces@DeclareParents

Key contrast the exam repeats: Spring AOP supports only method-execution join points, while AspectJ also supports field access, constructor execution and more.

Memory hook: Join point = WHERE it happens · Pointcut = which ones · Advice = what you do · Aspect = the class.
Q5 · True statements about Spring AOP

Runtime proxies only — no compile-time weaving, and the annotations come from AspectJ

Your answer: you ticked "Spring AOP can apply aspects at compile time"that's AspectJ. Spring AOP weaves at runtime, via proxies, only.

The three true statements were: AOP handles cross-cutting concerns; Spring AOP cannot proxy final methods; and JDK dynamic proxies are the default when the bean implements an interface. The fifth option was also false in a subtle way worth knowing: the @Aspect/@Before/@Around annotations are AspectJ's (org.aspectj.lang.annotation) — Spring borrows the annotation style and the pointcut parser, but the runtime is pure proxy-based Spring AOP with no AspectJ compiler or weaver involved.

Spring AOPAspectJ
Weavingruntime proxies onlycompile-time, post-compile, load-time
Join pointsmethod execution onlymethods, constructors, fields…
Proxy defaultJDK dynamic proxy with an interface; CGLIB withoutn/a — bytecode weaving
Can advisepublic methods on Spring beansanything, incl. final/private/non-beans

The proxy limits are a family: final methods/classes can't be overridden, private methods aren't advised, and self-invocation bypasses the proxy entirely (the classic reason an internal call to a @Transactional method does nothing).

Memory hook: Spring AOP = runtime proxies, method execution, public only. Compile-time weaving ⇒ AspectJ.
Q21 · Statements about advice

proceed() may be called any number of times — including zero

Your answer: you ticked "proceed() must be called up to 1 time only"false: call it repeatedly for retries, or not at all to block the call.

The two true statements: an @Around advice's first parameter must be ProceedingJoinPoint (it's the only advice type that gets one), and @AfterThrowing(throwing = "ex") narrows matching to methods that throw that exception type — declaring SQLException means the advice only fires for SQLException. The other distractor, @AfterFinally, doesn't exist — the "always runs" advice is @After (review #3).

What @Around gives you, from review #3's table: it's the only advice that can (a) call proceed() zero times and skip the method entirely, (b) call it many times to implement retry, (c) change the arguments via proceed(Object[] args), and (d) alter or swallow the return value / exception. Its return type should be Object and it should declare throws Throwable.

Memory hook: @Around + ProceedingJoinPoint = full control: skip it, repeat it, rewrite its args and result.
Q39 · @annotation(CustomTransaction)

Matches any method annotated with @CustomTransaction

Your answer: "Nothing, the pointcut expression is incorrect"it's a completely standard designator. Distrust options that claim something "doesn't work".

Learn the four annotation-matching designators by where the annotation sits — this distinction is the whole question:

DesignatorThe annotation must be on…
@annotation(X)the method being executed
@within(X)the declaring class of the method
@target(X)the runtime class of the target object
@args(X)the runtime type of an argument

Two gotchas: the annotation must be @Retention(RUNTIME) or it's invisible and the pointcut never matches; and with JDK proxies the interface method's annotations are checked, while CGLIB checks the target class's — so an annotation declared only on the interface may not match under CGLIB. (Also worth knowing, from the non-annotation family: execution(), within(), this(), target(), args(), bean().)

Memory hook: @annotation = on the method · @within = on the class · @target = on the instance · @args = on the argument.

③ Beans & scopes 2 misses

Q10 · Managing bean scopes

Choose the scope that fits the bean — no blanket rule

Your answer: "Use singleton scope for all beans to simplify configuration"the answer is "use the appropriate scope based on the bean's lifecycle and usage".

Every other option was an absolute — "all beans", "always", "avoid using scopes other than singleton". As review #3 noted, absolutes are where the wrong answer hides. On any "which practice is recommended" question, the balanced, it-depends option is nearly always correct.

The scope table, and when each fits: singleton (default, one per context) for stateless services and repositories · prototype for stateful, non-shared objects · request / session / application / websocket for web-scoped state — and remember from review #2 that only singleton and prototype work outside a web context.

Memory hook: "For all beans" / "always" / "never" = wrong. The right answer is "it depends on the bean".
Q52 · Prototype-scoped beans

New instance per request — but injected into a singleton, it's created once, eagerly

Your answer: under-selected — you missed one of the two true statements. You correctly rejected "initialised on bootstrap" and "container manages full lifecycle".

Four facts, and the exam tests the counter-intuitive middle two:

StatementTrue?Why
Created on demand, each time it's requestedyesa fresh instance per getBean()/injection point
Created eagerly when it's a dependency of a singletonyesit's injected when the singleton is built — and that same instance is then reused forever
Initialised at context bootstrapnoonly singletons are pre-instantiated
Container manages its full lifecycle incl. destructionnono destruction callbacks@PreDestroy/DisposableBean are never called; cleanup is yours

The practical consequence (and a favourite follow-up): injecting a prototype into a singleton with plain @Autowired gives you one instance for the singleton's whole life, defeating the point. For a genuinely fresh instance per call use ObjectProvider<T>.getObject(), @Lookup, or a scoped proxy.

Memory hook: Prototype = created on request, never pre-created, never destroyed by Spring. In a singleton it's created once.

④ Spring Security 2 misses

100% yesterday, 60% today — a different corner of the same topic. Both misses are about what a feature does, not how to configure it.

Q36 · @EnableGlobalMethodSecurity

"Global" means application-wide, not "web endpoints" — it enables method-level security

Your answer: "configures global security settings for securing web endpoints and URLs"that's HttpSecurity's job. This annotation switches on method annotations.

@EnableGlobalMethodSecurity turns on the annotations you put on individual methods, and each flag enables a different family:

@Configuration
@EnableGlobalMethodSecurity(
    prePostEnabled = true,   // @PreAuthorize / @PostAuthorize   (SpEL — review #4)
    securedEnabled = true,   // @Secured("ROLE_ADMIN")
    jsr250Enabled  = true)   // @RolesAllowed  (JSR-250)
public class SecurityConfig { }

Two separations to hold: URL security = HttpSecurity / SecurityFilterChain with request matchers; method security = this annotation + @PreAuthorize and friends. And in Spring Security 6+ the annotation is renamed @EnableMethodSecurity (with prePostEnabled on by default) — the exam's Boot 2.5 era still uses @EnableGlobalMethodSecurity.

Memory hook: "Global" = across all your methods, not across all your URLs. prePost / secured / jsr250.
Q53 · True statements about Spring Security

permitAll() opens a path — it does not switch security off

Your answer: you ticked "permitAll() allows bypassing Spring Security completely"it grants open access to matched requests while the filter chain keeps running.

The two true statements were: authentication data can come from many backends (database, LDAP, in-memory, custom — review #3's UserDetailsService fact) and access control can be configured at the method level. The three false ones are each worth recognising: permitAll() only whitelists a matcher (the request still passes through the filter chain, still gets a SecurityContext); Spring Security is not an implementation of the Java EE Security specification; and no JAAS policy file is required (JAAS integration exists but is optional and rare).

If you genuinely want a path to skip the chain, that's web.ignoring() / WebSecurityCustomizer — a different mechanism from permitAll(), and worth knowing precisely because the exam contrasts them.

Memory hook: permitAll = "everyone may enter", not "no door". Security stays on.

⑤ Spring Boot & Testing 2 misses

92% and 88% — your two strongest sections. Just these two facts left.

Q45 · Excluding auto-configuration in tests

The exclude attribute of @ImportAutoConfiguration (or a slice's excludeAutoConfiguration)

Your answer: "Use @ContextConfiguration instead of @SpringBootTest"that opts out of Boot's test machinery entirely; it isn't excluding anything.

There are three separate exclusion mechanisms, and the exam tests that you know test slices use their own:

ContextHow you exclude
Production app@SpringBootApplication(exclude = …) / @EnableAutoConfiguration(exclude = …)
Full-context testspring.autoconfigure.exclude in properties
Test slice (@WebMvcTest, @DataJpaTest, …)@ImportAutoConfiguration(exclude = …), or the slice's own excludeAutoConfiguration attribute
@WebMvcTest(controllers = OrderController.class,
            excludeAutoConfiguration = SecurityAutoConfiguration.class)
class OrderControllerTests { … }

The pitfalls are exam-shaped: slices are meta-annotated with @ImportAutoConfiguration, so exclusions on your application class have no effect on a slice, and spring.autoconfigure.exclude doesn't apply to slices either. There is no @DisableAutoConfiguration, and dropping a Maven dependency is a side-effect, not a mechanism.

Memory hook: App = @SpringBootApplication(exclude). Slice = @ImportAutoConfiguration(exclude) / excludeAutoConfiguration.
Q59 · Exposing all Actuator endpoints taught in review #2

management.endpoints.web.exposure.include=* — note the web

Your answer: under-selected — you missed one of the two valid properties. You correctly rejected the two with wrong key paths.

Two orthogonal switches, which is exactly why this keeps appearing:

ConcernPropertyDefault
Enabled — does the endpoint exist?management.endpoint.<id>.enabled · globally management.endpoints.enabled-by-defaultall enabled except shutdown
Exposed — is it reachable over HTTP?management.endpoints.web.exposure.include / .excludeonly health (and info)

The invalid keys in this question were management.endpoints.web.enabled-by-default (no web segment on that one) and management.endpoints.exposure.include (missing the web segment). Read the key path segment by segment. And note the safety point: include=* also exposes shutdown if you've enabled it — restrict Actuator in production.

Memory hook: enabled-by-default has NO "web". exposure.include HAS "web". Enabled ≠ exposed.

⑥ Spring MVC 1 miss

Q35 · Deserialising the request body taught in review #3

@RequestBody@RequestMapping only maps the URL

Your answer: "@RequestMapping"that routes the request; it never touches the body.

Review #3 covered this exact annotation. Keep the four apart by what part of the request each one reads:

AnnotationReadsExample
@RequestBodythe body, via an HttpMessageConvertercreateUser(@RequestBody User u)
@RequestParamquery string / form fields?page=2
@PathVariablea URI template segment/users/{id}
@RequestHeadera headerAuthorization
@RequestMappingnothing — it maps the handler to a URL@RequestMapping("/api")

The two distractors were a Jackson annotation (@JsonDeserialize, which customises how a type deserialises, not where the data comes from) and an invented one (@RequestDeserialize). Combine @RequestBody with @Valid for bean validation, and remember the body stream is read once.

Memory hook: Body ⇒ @RequestBody. Mapping ⇒ @RequestMapping. Jackson annotations shape types, they don't bind parameters.

Your close-the-gap checklist — attempt #5

The 18 facts, one line each
Do this next — you need 4 marks, and 4 of these were already in your old checklists (1) Change the ritual, not the reading. Before your next attempt, spend 30 minutes covering the checklists from #1, #2, #3 and #4 — 99 facts, all previously missed. Boot went 45 → 78 → 92 because it's the one topic you kept returning to; do that for everything. (2) Rebuild Data Management. Lesson 9 · Transactions (ACID, isolation, rollback rules), Lesson 8 · Spring JDBC (DataAccessException, DataSource types) and Lesson 10 · Spring Data JPA (keywords, derived queries). That section alone is 7 marks. (3) Close AOP for good. Lesson 7 — the vocabulary table, the five advice types, the four @ designators, and the Spring-AOP-vs-AspectJ contrast. (4) Use the clock. You have 85 minutes spare. On every multi-select, read each option and say "true or false" before moving on — that is 5 marks, more than you need.
I'm your teacher — ask me anything. Want a full transactions rebuild (propagation × isolation × rollback), an AOP blitz, or a merged rapid-fire round over all 99 misses from the five attempts — the highest-value drill available to you right now? Just ask. Say "quiz me on the 18" for this attempt only.
← Review #4 Retake the Mock Exam →