0

我正在使用Elasticsearch版本2.4.4。 然後我創造的測試案例ESIntegTestCase衍生,是這樣的:從ESIntegTestCase拋出的NullPointerException

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"); 
    } 
} 

解決「罐子地獄」的問題和閱讀一堆網頁約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?

回答

0

回答自己:-)

文檔位於:integration tests

有需要以下一些推廣:

  • 重要的限制是ESIntegTestCase類將使用JUnit才起作用。有沒有簡單的方法來使它與例如TestNG - 解釋如下。

  • 開始使用JUnit的附加參數:

    -Dtests.jarhell.check =假 避免罐子地獄

    -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)不是必需的。
相關問題