从ESIntegTestCase抛出NullPointerException

时间:2017-04-20 14:49:50

标签: elasticsearch nullpointerexception integration-testing

我使用的是Elasticsearch版本2.4.4。 然后我创建了源自ESIntegTestCase的测试用例,类似于:

public class ELSTest extends ESIntegTestCase {

    @Override
    protected Settings nodeSettings ( int nodeOrdinal ) {
        return Settings.builder().put( super.nodeSettings( nodeOrdinal ) )
            .put( super.nodeSettings( nodeOrdinal ) )
            .put( IndexMetaData.SETTING_NUMBER_OF_SHARDS, 1 )
            .put( IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 1 )
            .put( Node.HTTP_ENABLED, true )
            .build();
    }

    @BeforeClass
    public void setup () throws Exception {
        createIndex( "idx" ); // line 57
        ensureGreen( "idx" );
    }
}

解决了“jar hell”问题并阅读了关于 ESIntegTestCase 的一堆页面后,我得到了新的。

java.lang.NullPointerException
at org.elasticsearch.test.ESIntegTestCase.client(ESIntegTestCase.java:657)
at org.elasticsearch.test.ESIntegTestCase.client(ESIntegTestCase.java:650)
at org.elasticsearch.test.ESIntegTestCase.prepareCreate(ESIntegTestCase.java:763)
at com.company.ELSTest.setup(ELSTest.java:57)

它可能是什么原因?我指的是ESIntegTestCase类在行中抛出NPE的那个:

Client client = cluster().client();

似乎群集未初始化。什么是正确的非常基本的类设置,在测试中启动elasticsearch?

1 个答案:

答案 0 :(得分:1)

回答自己: - )

文档位于:integration tests

需要以下扩展:

  • 重要的限制是ESIntegTestCase类仅适用于JUnit。没有简单的方法让它与... TestNG - 解释如下。

  • 使用其他参数启动JUnit:

    -Dtests.jarhell.check =假 避免jar地狱

    -Dtests.security.manager =假 避免java.security.AccessControlException:访问被拒绝

  • 类声明如下:

    @RunWith(com.carrotsearch.randomizedtesting.RandomizedRunner.class) 公共类ELSTest扩展了ESIntegTestCase {

    @Before
    public void setup () throws Exception {
    
        beforeClass(); // against NullPointerException in ESIntegTestCase
    
        createIndex( "idx" );
        ensureGreen( "idx" );
    
        // ...
    }
    

    }

备注:

    需要
  • @RunWith 来避免java.lang.IllegalStateException:没有线程的上下文信息: 这就是为什么无法使用TestNG - TestNG没有RunWith注释。
  • @Before 无法更改为@BeforeClass,因为无法从静态上下文调用beforeClass()方法。
  • 方法nodeSettings(int nodeOrdinal)不是必需的。