diff --git a/pkg/analysis_server/test/lsp/completion_dart_test.dart b/pkg/analysis_server/test/lsp/completion_dart_test.dart
index 4dcb03b..d24cf19 100644
--- a/pkg/analysis_server/test/lsp/completion_dart_test.dart
+++ b/pkg/analysis_server/test/lsp/completion_dart_test.dart
@@ -63,6 +63,12 @@
     );
     expect(docs, matcher);
   }
+
+  @override
+  void setUp() {
+    super.setUp();
+    setApplyEditSupport();
+  }
 }
 
 @reflectiveTest
@@ -77,9 +83,7 @@
 
   Future<void> initializeServer() async {
     final initialAnalysis = waitForAnalysisComplete();
-    await initialize(
-        workspaceCapabilities:
-            withApplyEditSupport(emptyWorkspaceClientCapabilities));
+    await initialize();
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
   }
@@ -242,9 +246,7 @@
 
     final initialAnalysis = waitForAnalysisComplete();
     await provideConfig(
-      () => initialize(
-          workspaceCapabilities: withConfigurationSupport(
-              withApplyEditSupport(emptyWorkspaceClientCapabilities))),
+      initialize,
       {
         if (preference != null) 'documentation': preference,
       },
@@ -293,9 +295,7 @@
 
     final initialAnalysis = waitForAnalysisComplete();
     await provideConfig(
-      () => initialize(
-          workspaceCapabilities: withConfigurationSupport(
-              withApplyEditSupport(emptyWorkspaceClientCapabilities))),
+      initialize,
       {
         if (preference != null) 'documentation': preference,
       },
@@ -325,17 +325,13 @@
   }
 
   Future<void> checkCompleteFunctionCallInsertText(
-      String content, String completion,
-      {required String? editText, InsertTextFormat? insertTextFormat}) async {
-    await provideConfig(
-      () => initialize(
-        textDocumentCapabilities: withCompletionItemSnippetSupport(
-            emptyTextDocumentClientCapabilities),
-        workspaceCapabilities:
-            withConfigurationSupport(emptyWorkspaceClientCapabilities),
-      ),
-      {'completeFunctionCalls': true},
-    );
+    String content,
+    String completion, {
+    required String? editText,
+    InsertTextFormat? insertTextFormat,
+  }) async {
+    setCompletionItemSnippetSupport();
+    await provideConfig(initialize, {'completeFunctionCalls': true});
     await openFile(mainFileUri, withoutMarkers(content));
     final res = await getCompletion(mainFileUri, positionFromMarker(content));
     final item = res.singleWhere(
@@ -454,19 +450,11 @@
     final registrations = <Registration>[];
     // Provide empty config and collect dynamic registrations during
     // initialization.
-    await provideConfig(
-      () => monitorDynamicRegistrations(
-        registrations,
-        () => initialize(
-            textDocumentCapabilities:
-                withAllSupportedTextDocumentDynamicRegistrations(
-                    emptyTextDocumentClientCapabilities),
-            workspaceCapabilities:
-                withDidChangeConfigurationDynamicRegistration(
-                    withConfigurationSupport(
-                        emptyWorkspaceClientCapabilities))),
-      ),
-      {},
+    setDidChangeConfigurationDynamicRegistration();
+    setAllSupportedTextDocumentDynamicRegistrations();
+    await monitorDynamicRegistrations(
+      registrations,
+      () => provideConfig(initialize, {}),
     );
 
     Registration registration(Method method) =>
@@ -481,7 +469,9 @@
     // When we change config, we should get a re-registration (unregister then
     // register) for completion which now includes the commit characters.
     await monitorDynamicReregistration(
-        registrations, () => updateConfig({'previewCommitCharacters': true}));
+      registrations,
+      () => updateConfig({'previewCommitCharacters': true}),
+    );
     reg = registration(Method.textDocument_completion);
     options = CompletionRegistrationOptions.fromJson(
         reg.registerOptions as Map<String, Object?>);
@@ -652,15 +642,8 @@
 }
 ''';
 
-    await provideConfig(
-      () => initialize(
-        textDocumentCapabilities: withCompletionItemSnippetSupport(
-            emptyTextDocumentClientCapabilities),
-        workspaceCapabilities:
-            withConfigurationSupport(emptyWorkspaceClientCapabilities),
-      ),
-      {'completeFunctionCalls': true},
-    );
+    setCompletionItemSnippetSupport();
+    await provideConfig(initialize, {'completeFunctionCalls': true});
     await openFile(mainFileUri, withoutMarkers(content));
     final res = await getCompletion(mainFileUri, positionFromMarker(content));
     final item = res.singleWhere((c) => c.label.startsWith('setState('));
@@ -737,15 +720,8 @@
     }
 ''';
 
-    await provideConfig(
-      () => initialize(
-        textDocumentCapabilities: withCompletionItemSnippetSupport(
-            emptyTextDocumentClientCapabilities),
-        workspaceCapabilities:
-            withConfigurationSupport(emptyWorkspaceClientCapabilities),
-      ),
-      {'completeFunctionCalls': true},
-    );
+    setCompletionItemSnippetSupport();
+    await provideConfig(initialize, {'completeFunctionCalls': true});
     await openFile(mainFileUri, withoutMarkers(content));
     final res = await getCompletion(mainFileUri, positionFromMarker(content));
     final item = res.singleWhere((c) => c.label == 'myFunction(…)');
@@ -770,16 +746,9 @@
     }
 ''';
 
+    setCompletionItemSnippetSupport();
     final initialAnalysis = waitForAnalysisComplete();
-    await provideConfig(
-      () => initialize(
-        textDocumentCapabilities: withCompletionItemSnippetSupport(
-            emptyTextDocumentClientCapabilities),
-        workspaceCapabilities: withApplyEditSupport(
-            withConfigurationSupport(emptyWorkspaceClientCapabilities)),
-      ),
-      {'completeFunctionCalls': true},
-    );
+    await provideConfig(initialize, {'completeFunctionCalls': true});
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
 
@@ -827,16 +796,9 @@
       );
     }
 
+    setCompletionItemSnippetSupport();
     final initialAnalysis = waitForAnalysisComplete();
-    await provideConfig(
-      () => initialize(
-        textDocumentCapabilities: withCompletionItemSnippetSupport(
-            emptyTextDocumentClientCapabilities),
-        workspaceCapabilities:
-            withConfigurationSupport(emptyWorkspaceClientCapabilities),
-      ),
-      {'completeFunctionCalls': true},
-    );
+    await provideConfig(initialize, {'completeFunctionCalls': true});
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
     final res = await getCompletion(mainFileUri, positionFromMarker(content));
@@ -854,15 +816,8 @@
     import 'dart:math' show mi^
 ''';
 
-    await provideConfig(
-      () => initialize(
-        textDocumentCapabilities: withCompletionItemSnippetSupport(
-            emptyTextDocumentClientCapabilities),
-        workspaceCapabilities:
-            withConfigurationSupport(emptyWorkspaceClientCapabilities),
-      ),
-      {'completeFunctionCalls': true},
-    );
+    setCompletionItemSnippetSupport();
+    await provideConfig(initialize, {'completeFunctionCalls': true});
     await openFile(mainFileUri, withoutMarkers(content));
     final res = await getCompletion(mainFileUri, positionFromMarker(content));
     final item = res.singleWhere((c) => c.label == 'min(…)');
@@ -1655,9 +1610,7 @@
     );
 
     final initialAnalysis = waitForAnalysisComplete();
-    await initialize(
-        workspaceCapabilities:
-            withApplyEditSupport(emptyWorkspaceClientCapabilities));
+    await initialize();
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
     final res =
@@ -1689,12 +1642,7 @@
     );
 
     final initialAnalysis = waitForAnalysisComplete();
-    await provideConfig(
-      () => initialize(
-          workspaceCapabilities: withApplyEditSupport(
-              withConfigurationSupport(emptyWorkspaceClientCapabilities))),
-      {'maxCompletionItems': 200},
-    );
+    await provideConfig(initialize, {'maxCompletionItems': 200});
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
     final res =
@@ -1854,12 +1802,7 @@
     );
 
     final initialAnalysis = waitForAnalysisComplete();
-    await provideConfig(
-      () => initialize(
-          workspaceCapabilities: withApplyEditSupport(
-              withConfigurationSupport(emptyWorkspaceClientCapabilities))),
-      {'maxCompletionItems': 10},
-    );
+    await provideConfig(initialize, {'maxCompletionItems': 10});
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
     final res =
@@ -1896,15 +1839,9 @@
       ].join('\n'),
     );
 
+    setCompletionItemSnippetSupport();
     final initialAnalysis = waitForAnalysisComplete();
-    await provideConfig(
-      () => initialize(
-          textDocumentCapabilities: withCompletionItemSnippetSupport(
-              emptyTextDocumentClientCapabilities),
-          workspaceCapabilities: withApplyEditSupport(
-              withConfigurationSupport(emptyWorkspaceClientCapabilities))),
-      {'maxCompletionItems': 10},
-    );
+    await provideConfig(initialize, {'maxCompletionItems': 10});
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
     final res =
@@ -2116,9 +2053,8 @@
     void f() { }
 ''';
 
-    await initialize(
-        textDocumentCapabilities: withCompletionItemSnippetSupport(
-            emptyTextDocumentClientCapabilities));
+    setCompletionItemSnippetSupport();
+    await initialize();
     await openFile(mainFileUri, withoutMarkers(content));
     final res = await getCompletion(mainFileUri, positionFromMarker(content));
     expect(res.any((c) => c.label == 'one: '), isTrue);
@@ -2149,6 +2085,7 @@
     }
 ''';
 
+    setCompletionItemSnippetSupport();
     await initialize(
         textDocumentCapabilities: withCompletionItemSnippetSupport(
             emptyTextDocumentClientCapabilities));
@@ -2357,9 +2294,7 @@
 ''';
 
     final initialAnalysis = waitForAnalysisComplete();
-    await initialize(
-        workspaceCapabilities:
-            withApplyEditSupport(emptyWorkspaceClientCapabilities));
+    await initialize();
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
     final res = await getCompletion(mainFileUri, positionFromMarker(content));
@@ -2464,9 +2399,7 @@
 ''';
 
     final initialAnalysis = waitForAnalysisComplete();
-    await initialize(
-        workspaceCapabilities:
-            withApplyEditSupport(emptyWorkspaceClientCapabilities));
+    await initialize();
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
 
@@ -2508,9 +2441,7 @@
 ''';
 
     final initialAnalysis = waitForAnalysisComplete();
-    await initialize(
-        workspaceCapabilities:
-            withApplyEditSupport(emptyWorkspaceClientCapabilities));
+    await initialize();
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
 
@@ -2542,9 +2473,7 @@
 ''';
 
     final initialAnalysis = waitForAnalysisComplete();
-    await initialize(
-        workspaceCapabilities:
-            withApplyEditSupport(emptyWorkspaceClientCapabilities));
+    await initialize();
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
     final res = await getCompletion(mainFileUri, positionFromMarker(content));
@@ -2589,9 +2518,7 @@
 ''';
 
     final initialAnalysis = waitForAnalysisComplete();
-    await initialize(
-        workspaceCapabilities:
-            withApplyEditSupport(emptyWorkspaceClientCapabilities));
+    await initialize();
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
     final res = await getCompletion(mainFileUri, positionFromMarker(content));
@@ -2672,9 +2599,7 @@
 ''';
 
     final initialAnalysis = waitForAnalysisComplete();
-    await initialize(
-        workspaceCapabilities:
-            withApplyEditSupport(emptyWorkspaceClientCapabilities));
+    await initialize();
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
     final res = await getCompletion(mainFileUri, positionFromMarker(content));
@@ -2716,9 +2641,7 @@
 ''';
 
     final initialAnalysis = waitForAnalysisComplete();
-    await initialize(
-        workspaceCapabilities:
-            withApplyEditSupport(emptyWorkspaceClientCapabilities));
+    await initialize();
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
     final res = await getCompletion(mainFileUri, positionFromMarker(content));
@@ -2819,9 +2742,7 @@
 ''';
 
     final initialAnalysis = waitForAnalysisComplete();
-    await initialize(
-        workspaceCapabilities:
-            withApplyEditSupport(emptyWorkspaceClientCapabilities));
+    await initialize();
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
     final res = await getCompletion(mainFileUri, positionFromMarker(content));
@@ -2857,8 +2778,6 @@
     await initialize(
       textDocumentCapabilities: withCompletionItemInsertReplaceSupport(
           emptyTextDocumentClientCapabilities),
-      workspaceCapabilities:
-          withApplyEditSupport(emptyWorkspaceClientCapabilities),
     );
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
@@ -2957,9 +2876,7 @@
 ''';
 
     final initialAnalysis = waitForAnalysisComplete();
-    await initialize(
-        workspaceCapabilities:
-            withApplyEditSupport(emptyWorkspaceClientCapabilities));
+    await initialize();
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
     final res = await getCompletion(mainFileUri, positionFromMarker(content));
@@ -3008,13 +2925,12 @@
 
     final initialAnalysis = waitForAnalysisComplete();
     await initialize(
-        initializationOptions: {
-          ...?defaultInitializationOptions,
-          // Set budget high to ensure it completes.
-          'completionBudgetMilliseconds': 100000,
-        },
-        workspaceCapabilities:
-            withApplyEditSupport(emptyWorkspaceClientCapabilities));
+      initializationOptions: {
+        ...?defaultInitializationOptions,
+        // Set budget high to ensure it completes.
+        'completionBudgetMilliseconds': 100000,
+      },
+    );
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
     final res =
@@ -3038,13 +2954,12 @@
 
     final initialAnalysis = waitForAnalysisComplete();
     await initialize(
-        initializationOptions: {
-          ...?defaultInitializationOptions,
-          // Set budget low to ensure we don't complete.
-          'completionBudgetMilliseconds': 0,
-        },
-        workspaceCapabilities:
-            withApplyEditSupport(emptyWorkspaceClientCapabilities));
+      initializationOptions: {
+        ...?defaultInitializationOptions,
+        // Set budget low to ensure we don't complete.
+        'completionBudgetMilliseconds': 0,
+      },
+    );
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
     final res =
@@ -3066,9 +2981,7 @@
 
     final mainFileContent = 'MyOtherClass^';
     final initialAnalysis = waitForAnalysisComplete();
-    await initialize(
-        workspaceCapabilities:
-            withApplyEditSupport(emptyWorkspaceClientCapabilities));
+    await initialize();
     await openFile(mainFileUri, withoutMarkers(mainFileContent));
     await initialAnalysis;
 
@@ -3108,9 +3021,7 @@
 ''';
 
     final initialAnalysis = waitForAnalysisComplete();
-    await initialize(
-        workspaceCapabilities:
-            withApplyEditSupport(emptyWorkspaceClientCapabilities));
+    await initialize();
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
     final res = await getCompletion(mainFileUri, positionFromMarker(content));
@@ -3183,10 +3094,7 @@
 ''';
 
     final initialAnalysis = waitForAnalysisComplete();
-    await initialize(
-      workspaceCapabilities:
-          withApplyEditSupport(emptyWorkspaceClientCapabilities),
-    );
+    await initialize();
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
     final res = await getCompletion(mainFileUri, positionFromMarker(content));
@@ -3306,14 +3214,12 @@
 ''';
 
     final initialAnalysis = waitForAnalysisComplete();
-    // Support applyEdit, but explicitly disable the suggestions.
+    // applyEdit is supported in setUp, but explicitly disable the suggestions.
     await initialize(
       initializationOptions: {
         ...?defaultInitializationOptions,
         'suggestFromUnimportedLibraries': false,
       },
-      workspaceCapabilities:
-          withApplyEditSupport(emptyWorkspaceClientCapabilities),
     );
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
@@ -3329,6 +3235,8 @@
   Future<void> test_unimportedSymbols_unavailableWithoutApplyEdit() async {
     // If client doesn't advertise support for workspace/applyEdit, we won't
     // include suggestion sets.
+    setApplyEditSupport(false);
+
     newFile(
       join(projectFolderPath, 'other_file.dart'),
       'class InOtherFile {}',
@@ -3391,9 +3299,7 @@
     String expectedContent,
   ) async {
     final initialAnalysis = waitForAnalysisComplete();
-    await initialize(
-        workspaceCapabilities:
-            withApplyEditSupport(emptyWorkspaceClientCapabilities));
+    await initialize();
     await openFile(fileUri, withoutMarkers(content));
     await initialAnalysis;
     final res = await getCompletion(fileUri, positionFromMarker(content));
@@ -3445,7 +3351,7 @@
 clas^
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     final updated = await expectAndApplySnippet(
       content,
       prefix: ClassDeclaration.prefix,
@@ -3464,17 +3370,8 @@
   Future<void> test_snippets_disabled() async {
     final content = '^';
 
-    // Advertise support (this is done by the editor), but with the user
-    // preference disabled.
-    await provideConfig(
-      () => initialize(
-        textDocumentCapabilities: withCompletionItemSnippetSupport(
-            emptyTextDocumentClientCapabilities),
-        workspaceCapabilities:
-            withConfigurationSupport(emptyWorkspaceClientCapabilities),
-      ),
-      {'enableSnippets': false},
-    );
+    // Support is set in setUp, but here we disable the user preference.
+    await provideConfig(initialize, {'enableSnippets': false});
 
     await expectNoSnippets(content);
   }
@@ -3486,7 +3383,7 @@
 }
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     final updated = await expectAndApplySnippet(
       content,
       prefix: DoStatement.prefix,
@@ -3514,7 +3411,7 @@
 ''';
 
     final initialAnalysis = waitForAnalysisComplete();
-    await initializeWithSnippetSupport();
+    await initialize();
     await openFile(mainFileUri, withoutMarkers(content));
     await initialAnalysis;
 
@@ -3549,7 +3446,7 @@
 class B {}
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     await expectNoSnippet(
       content,
       FlutterStatelessWidget.prefix,
@@ -3563,7 +3460,7 @@
 }
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     final updated = await expectAndApplySnippet(
       content,
       prefix: ForStatement.prefix,
@@ -3586,7 +3483,7 @@
 }
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     final updated = await expectAndApplySnippet(
       content,
       prefix: ForInStatement.prefix,
@@ -3609,7 +3506,7 @@
 }
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     final updated = await expectAndApplySnippet(
       content,
       prefix: FunctionDeclaration.prefix,
@@ -3632,7 +3529,7 @@
 }
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     final updated = await expectAndApplySnippet(
       content,
       prefix: FunctionDeclaration.prefix,
@@ -3653,7 +3550,7 @@
 fun^
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     final updated = await expectAndApplySnippet(
       content,
       prefix: FunctionDeclaration.prefix,
@@ -3674,7 +3571,7 @@
 }
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     final updated = await expectAndApplySnippet(
       content,
       prefix: IfStatement.prefix,
@@ -3697,7 +3594,7 @@
 }
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     final updated = await expectAndApplySnippet(
       content,
       prefix: IfElseStatement.prefix,
@@ -3723,7 +3620,7 @@
 class B {}
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     final updated = await expectAndApplySnippet(
       content,
       prefix: MainFunction.prefix,
@@ -3746,6 +3643,7 @@
 
     // If we don't send support for Snippet CompletionItem kinds, we don't
     // expect any snippets at all.
+    setCompletionItemSnippetSupport(false);
     await initialize();
     await openFile(mainFileUri, withoutMarkers(content));
     final res = await getCompletion(mainFileUri, positionFromMarker(content));
@@ -3759,7 +3657,7 @@
 }
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     final updated = await expectAndApplySnippet(
       content,
       prefix: SwitchStatement.prefix,
@@ -3787,7 +3685,7 @@
 }
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     final updated = await expectAndApplySnippet(
       content,
       prefix: TestDefinition.prefix,
@@ -3814,7 +3712,7 @@
 }
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     final updated = await expectAndApplySnippet(
       content,
       prefix: TestGroupDefinition.prefix,
@@ -3837,7 +3735,7 @@
 }
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     final updated = await expectAndApplySnippet(
       content,
       prefix: TryCatchStatement.prefix,
@@ -3862,7 +3760,7 @@
 }
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     final updated = await expectAndApplySnippet(
       content,
       prefix: WhileStatement.prefix,
@@ -3908,7 +3806,7 @@
 class B {}
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     final updated = await expectAndApplySnippet(
       content,
       prefix: FlutterStatefulWidget.prefix,
@@ -3949,7 +3847,7 @@
 class B {}
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     final updated = await expectAndApplySnippet(
       content,
       prefix: FlutterStatefulWidgetWithAnimationController.prefix,
@@ -4005,7 +3903,7 @@
 class B {}
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     final updated = await expectAndApplySnippet(
       content,
       prefix: FlutterStatelessWidget.prefix,
@@ -4039,7 +3937,7 @@
 class B {}
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     final updated = await expectAndApplySnippet(
       content,
       prefix: FlutterStatelessWidget.prefix,
@@ -4069,7 +3967,7 @@
 stless^
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     final updated = await expectAndApplySnippet(
       content,
       prefix: FlutterStatelessWidget.prefix,
@@ -4095,7 +3993,7 @@
 ^
 '''; // Deliberate trailing newline to ensure imports aren't inserted at "end".
 
-    await initializeWithSnippetSupport();
+    await initialize();
     final updated = await expectAndApplySnippet(
       content,
       prefix: FlutterStatelessWidget.prefix,
@@ -4125,7 +4023,7 @@
 }
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     await expectNoSnippet(
       content,
       FlutterStatelessWidget.prefix,
@@ -4137,7 +4035,7 @@
 stle^
 ''';
 
-    await initializeWithSnippetSupport();
+    await initialize();
     final otherFileUri = pathContext.toUri(convertPath('/other/file.dart'));
     await openFile(otherFileUri, withoutMarkers(content));
     final res = await getCompletion(otherFileUri, positionFromMarker(content));
@@ -4229,8 +4127,9 @@
     return item;
   }
 
-  Future<void> initializeWithSnippetSupport() => initialize(
-        textDocumentCapabilities: withCompletionItemSnippetSupport(
-            emptyTextDocumentClientCapabilities),
-      );
+  @override
+  void setUp() {
+    super.setUp();
+    setCompletionItemSnippetSupport();
+  }
 }
diff --git a/pkg/analysis_server/test/lsp/server_abstract.dart b/pkg/analysis_server/test/lsp/server_abstract.dart
index 3d208ca..43b46e0 100644
--- a/pkg/analysis_server/test/lsp/server_abstract.dart
+++ b/pkg/analysis_server/test/lsp/server_abstract.dart
@@ -427,15 +427,30 @@
     }
   }
 
+  void setAllSupportedTextDocumentDynamicRegistrations() {
+    textDocumentCapabilities = withAllSupportedTextDocumentDynamicRegistrations(
+        textDocumentCapabilities);
+  }
+
   void setApplyEditSupport([bool supported = true]) {
     workspaceCapabilities =
         withApplyEditSupport(workspaceCapabilities, supported);
   }
 
+  void setCompletionItemSnippetSupport([bool supported = true]) {
+    textDocumentCapabilities =
+        withCompletionItemSnippetSupport(textDocumentCapabilities, supported);
+  }
+
   void setConfigurationSupport() {
     workspaceCapabilities = withConfigurationSupport(workspaceCapabilities);
   }
 
+  void setDidChangeConfigurationDynamicRegistration() {
+    workspaceCapabilities =
+        withDidChangeConfigurationDynamicRegistration(workspaceCapabilities);
+  }
+
   void setDocumentChangesSupport([bool supported = true]) {
     workspaceCapabilities =
         withDocumentChangesSupport(workspaceCapabilities, supported);
@@ -603,11 +618,12 @@
   }
 
   TextDocumentClientCapabilities withCompletionItemSnippetSupport(
-    TextDocumentClientCapabilities source,
-  ) {
+    TextDocumentClientCapabilities source, [
+    bool supported = true,
+  ]) {
     return extendTextDocumentCapabilities(source, {
       'completion': {
-        'completionItem': {'snippetSupport': true}
+        'completionItem': {'snippetSupport': supported}
       }
     });
   }
@@ -1395,6 +1411,8 @@
 
   /// Calls the supplied function and responds to any `workspace/configuration`
   /// request with the supplied config.
+  ///
+  /// Automatically enables `workspace/configuration` support.
   Future<T> provideConfig<T>(
     Future<T> Function() f,
     FutureOr<Map<String, Object?>> globalConfig, {
