To add some additional information, the stack trace I'm seeing is.:

java.lang.NullPointerException
    at
org.apache.lucene.util.LuceneTestCase.maybeChangeLiveIndexWriterConfig(LuceneTestCase.java:1080)
    at
org.apache.lucene.index.RandomIndexWriter.addDocument(RandomIndexWriter.java:103)
    at
org.apache.lucene.index.LuceneIndexer.indexOneDocument(LuceneIndexer.java:55)
    at
org.apache.lucene.index.TestSample.indexAnimalTestData(TestSample.java:45)
    at org.apache.lucene.index.TestSample.setUp(TestSample.java:24)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at
com.carrotsearch.randomizedtesting.RandomizedRunner.invoke(RandomizedRunner.java:1618)
    at
com.carrotsearch.randomizedtesting.RandomizedRunner$7.evaluate(RandomizedRunner.java:861)
    at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:46)
    at
com.carrotsearch.randomizedtesting.rules.StatementAdapter.evaluate(StatementAdapter.java:36)
    at
com.carrotsearch.randomizedtesting.ThreadLeakControl$StatementRunner.run(ThreadLeakControl.java:365)
    at
com.carrotsearch.randomizedtesting.ThreadLeakControl.forkTimeoutingTask(ThreadLeakControl.java:798)
    at
com.carrotsearch.randomizedtesting.ThreadLeakControl$3.evaluate(ThreadLeakControl.java:458)
    at
com.carrotsearch.randomizedtesting.RandomizedRunner.runSingleTest(RandomizedRunner.java:836)
    at
com.carrotsearch.randomizedtesting.RandomizedRunner$3.evaluate(RandomizedRunner.java:738)
    at
com.carrotsearch.randomizedtesting.RandomizedRunner$4.evaluate(RandomizedRunner.java:772)
    at
com.carrotsearch.randomizedtesting.RandomizedRunner$5.evaluate(RandomizedRunner.java:783)
    at
com.carrotsearch.randomizedtesting.rules.StatementAdapter.evaluate(StatementAdapter.java:36)
    at
com.carrotsearch.randomizedtesting.ThreadLeakControl$StatementRunner.run(ThreadLeakControl.java:365)
    at
com.carrotsearch.randomizedtesting.ThreadLeakControl.forkTimeoutingTask(ThreadLeakControl.java:798)
    at
com.carrotsearch.randomizedtesting.ThreadLeakControl$2.evaluate(ThreadLeakControl.java:401)
    at
com.carrotsearch.randomizedtesting.RandomizedRunner.runSuite(RandomizedRunner.java:642)
    at
com.carrotsearch.randomizedtesting.RandomizedRunner.access$200(RandomizedRunner.java:129)
    at
com.carrotsearch.randomizedtesting.RandomizedRunner$1.run(RandomizedRunner.java:559)


This is the indexing @Rule fixture I've tried putting together:

public class LuceneIndexer extends ExternalResource {
    public static final String TEST_FIELD_NAME = "TEST_FIELD_NAME";

    private final Analyzer analyzer;
    private final Directory directory;
    private RandomIndexWriter writer;

    public LuceneIndexer(Directory directory, Analyzer analyzer) {
        this.directory = directory;
        this.analyzer = analyzer;
    }

    public Directory getDirectory() {
        return directory;
    }

    @Override
    public void before() throws IOException {
        writer = new RandomIndexWriter(LuceneTestCase.random(), directory,
new IndexWriterConfig(analyzer));
    }

    @Override
    public void after() {
        try {
            IOUtils.close(directory, analyzer);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public void close() throws IOException {
        IOUtils.close(writer);
    }

    public void indexOneDocument(String text) throws IOException {
        Document document = createDocumentFromText(text);
        writer.addDocument(document);
    }

    private Document createDocumentFromText(String documentText) {
        Document document = new Document();
        FieldType defaultFieldConfig = new FieldType();

defaultFieldConfig.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS);
        Field field = new Field(TEST_FIELD_NAME, documentText,
defaultFieldConfig);
        document.add(field);

        return document;
    }
}

I'm reproducing the issue with the following test case below:

@RunWith(com.carrotsearch.randomizedtesting.RandomizedRunner.class)
public class TestSample {

    @Rule
    public LuceneIndexer indexerFixture = new
LuceneIndexer(LuceneTestCase.newDirectory(), new
MockAnalyzer(LuceneTestCase.random()));

    @Before
    public void setUp() throws IOException {
      indexerFixture.indexOneDocument("document");
      indexerFixture.indexOneDocument("another document");
      indexerFixture.indexOneDocument("third document");
      // NPE occurs when this last call gets down to
LuceneTestCase.maybeChangeLiveIndexWriterConfig()
      indexerFixture.indexOneDocument("last document");

      indexerFixture.close();
    }

    @Test
    public void first_reader() {
        System.out.println("In first test");
    }

    @Test
    public void second_test() {
        System.out.println("In second test");
    }
}


On Wed, Nov 12, 2014 at 2:51 PM, Dawid Weiss <[email protected]>
wrote:

> > it looks like some static fields in LTC aren't being initialized.
>
> If your code is executed within a static initializer then these fields
> won't be initialized. Like Chris said -- post the full stack trace
> and, ideally, a short snippet of code demonstrating what you're doing
> (or trying to do).
>
> > I can't extend LTC because my fixtures already need to extend JUnit's
> 'Rule' class for JUnit to know how to use them
>
> This isn't true. Your suite class can extend LTC and you can add
> additional rules within that class. You probably mean something else
> -- be specific, provide code examples.
>
> Dawid
>
> On Wed, Nov 12, 2014 at 4:06 PM, Jason Gerlowski <[email protected]>
> wrote:
> > Hi all,
> >
> > I'm seeing NPE's when calling static methods on LuceneTestCase (without
> > extending it).
> >
> > I'm trying to write tests for a few classes that interact with Lucene.
> To
> > do that, I was trying to create JUnit @Rule
> > (https://github.com/junit-team/junit/wiki/Rules) fixtures that I can
> share
> > across different test classes.  I want these fixtures to use the
> > randomness/extra-checks found in LuceneTestCase, but I can't extend LTC
> > because my fixtures already need to extend JUnit's 'Rule' class for
> JUnit to
> > know how to use them.
> >
> > So instead I wrote the fixtures to access LTC functionality though the
> > class's static methods (LTC.newDirectory(), LTC.newSearcher(), etc.)
> >
> > Is this a valid way to access LTC methods?  Is there any special
> > initialization I need to do before using the class in this way?
> >
> > I ask because I've started to see a few occasional NPE's in LTC during
> tests
> > that use these fixtures.  To an amateur, it looks like some static
> fields in
> > LTC aren't being initialized.  It's hard to tell whether I should
> consider
> > this a bug in the class, or whether I'm using it incorrectly.
> >
> > Thanks for any help/insight you can offer!
> >
> > Best,
> >
> > Jason Gerlowski
> >
> >
> > (I can follow-up with code-snippets that reproduce this issue.  I didn't
> > post them in this email because I thought I might just be misusing
> > LuceneTestCase).
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

Reply via email to