{"record":{"id":"2639b484e4e7d7e5","repo":"google/guava","slug":"call-using-before-createtestsuite","errorCode":null,"errorMessage":"Call using() before createTestSuite().","messagePattern":"Call using\\(\\) before createTestSuite\\(\\)\\.","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"android/guava-testlib/src/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilder.java","lineNumber":209,"sourceCode":"    List<Class<? extends AbstractTester>> testers = getTesters();\n\n    TestSuite suite = new TestSuite(name);\n    for (@SuppressWarnings(\"rawtypes\") // class literals\n    Class<? extends AbstractTester> testerClass : testers) {\n      @SuppressWarnings(\"unchecked\") // getting rid of the raw type, for better or for worse\n      TestSuite testerSuite =\n          makeSuiteForTesterClass((Class<? extends AbstractTester<?>>) testerClass);\n      if (testerSuite.countTestCases() > 0) {\n        suite.addTest(testerSuite);\n      }\n    }\n    return suite;\n  }\n\n  /** Throw {@link IllegalStateException} if {@link #createTestSuite()} can't be called yet. */\n  protected void checkCanCreate() {\n    if (subjectGenerator == null) {\n      throw new IllegalStateException(\"Call using() before createTestSuite().\");\n    }\n    if (name == null) {\n      throw new IllegalStateException(\"Call named() before createTestSuite().\");\n    }\n    if (features == null) {\n      throw new IllegalStateException(\"Call withFeatures() before createTestSuite().\");\n    }\n  }\n\n  @SuppressWarnings(\"rawtypes\") // class literals\n  protected abstract List<Class<? extends AbstractTester>> getTesters();\n\n  private boolean matches(Test test) {\n    Method method;\n    try {\n      method = extractMethod(test);\n    } catch (IllegalArgumentException e) {\n      logger.finer(Platform.format(\"%s: including by default: %s\", test, e.getMessage()));","sourceCodeStart":191,"sourceCodeEnd":227,"githubUrl":"https://github.com/google/guava/blob/94f39958baf7ad51ddf9c70e406ed6b188194daa/android/guava-testlib/src/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilder.java#L191-L227","documentation":"Thrown by FeatureSpecificTestSuiteBuilder.checkCanCreate() when you call createTestSuite() without having supplied a subject generator (the factory that produces the collection/map under test). The builder refuses to build a TestSuite because it has no object to test. checkCanCreate() guards the head of createTestSuite() and runs before any tester is instantiated.","triggerScenarios":"Calling builder.createTestSuite() after constructing a TestSuiteBuilder subclass (e.g. ListTestSuiteBuilder, MapTestSuiteBuilder) without first invoking the builder method that installs a TestContainerGenerator/subject generator (the using(...) family or a constructor that accepts one). subjectGenerator == null at line 208 trips the guard.","commonSituations":"Copying an existing Guava-testlib suite wiring and forgetting the .using(new MyCollectionGenerator()) line; refactoring a builder chain and dropping the generator; creating a fresh builder via the no-arg constructor of a subclass that does not set subjectGenerator.","solutions":["Call the builder's using(...) (or the subclass-specific generator-setting method) with a TestContainerGenerator before createTestSuite(), e.g. ListTestSuiteBuilder.using(new TestListGenerator<>()).","If your builder subclass takes the generator in its constructor, make sure you are instantiating the subclass that sets subjectGenerator rather than the abstract base.","Verify the builder chain order: using(...) -> named(...) -> withFeatures(...) -> createTestSuite()."],"exampleFix":"// before\nTestSuite suite = ListTestSuiteBuilder.using()\n    .named(\"MyList\")\n    .withFeatures(ListFeature.GENERAL_PURPOSE)\n    .createTestSuite();\n\n// after\nTestSuite suite = ListTestSuiteBuilder.using(new MyListGenerator())\n    .named(\"MyList\")\n    .withFeatures(ListFeature.GENERAL_PURPOSE)\n    .createTestSuite();","handlingStrategy":"validation","validationCode":"// Validate builder state before calling createTestSuite().\nFeatureSpecificTestSuiteBuilder<?,?> b = ListTestSuiteBuilder.using(gen);\n// using(...) must be called; verify the generator is non-null.\njava.util.Objects.requireNonNull(gen, \"subject generator is required by using()\");\nTestSuite suite = b.named(\"MyList\").withFeatures(ListFeature.GENERAL_PURPOSE).createTestSuite();","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Standardize the builder chain order using(...) -> named(...) -> withFeatures(...) -> createTestSuite() and lint for it.","Centralize suite construction in a helper that requires the generator as a non-null parameter."],"tags":["guava-testlib","test-setup","illegal-state","builder"],"backgroundTag":null,"analyzedSha":"94f39958baf7ad51ddf9c70e406ed6b188194daa","analyzedAt":"2026-08-13T22:50:30.265Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}