2009-06-01 123 views
17

我正在为我的solr-indexer应用程序编写一些测试代码。在测试最佳实践之后,我想编写代码独立的代码,只需加载schema.xmlsolrconfig.xml并为索引搜索测试创建一个临时数据树。 由于应用程序大部分是用java编写的,我正在处理SolrJ库,但我遇到了问题(好吧,我迷失在corecontainers-coredescriptor-coreconfig-solrcore的宇宙中......) 任何人都可以将这里有一些代码来创建一个嵌入式服务器来加载配置,并写入一个参数为基础的数据目录?通过嵌入式服务器测试Solr

+3

小心!我相信只有JUnit 4.7支持下面概述的方法。在使用Solr Base测试的较新版本的JUnit中会出现某种setup()动态调用错误。 – jayunit100 2012-02-02 17:21:06

+0

我在这里回答了一个类似的问题:http://stackoverflow.com/a/23102896/1410035 – 2014-04-16 07:37:44

回答

10

您可以从SolrExampleTests开始,它延伸SolrExampleTestBase,它延伸到AbstractSolrTestCase

也是这个SampleTest

也看看thisthis线程。

+1

SolrExampleTests:http://svn.apache.org/repos/asf/lucene/solr/tags/release- 1.4.0/src/test/org/apache/solr/client/solrj/SolrExampleTests.java – High6 2011-08-26 15:32:14

+2

这是指1.4版本的solr。如果你需要这些类的3.5版本,那么maven central有一个solr-test-framework artifact。 http://mvnrepository.com/artifact/org.apache.solr/solr-test-framework – unscene 2012-02-26 17:21:52

7

这是一个简单测试用例的例子。 Solr的是包含Solr的配置文件的目录:

 
import java.io.IOException; 
import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer; 
import org.apache.solr.util.AbstractSolrTestCase; 
import org.apache.solr.client.solrj.SolrQuery; 
import org.apache.solr.client.solrj.SolrServer; 
import org.apache.solr.client.solrj.SolrServerException; 
import org.apache.solr.client.solrj.response.QueryResponse; 
import org.apache.solr.common.SolrInputDocument; 
import org.apache.solr.common.params.SolrParams; 
import org.junit.Before; 
import org.junit.Test; 

import static org.junit.Assert.assertEquals; 

public class SolrSearchConfigTest extends AbstractSolrTestCase { 

    private SolrServer server; 

    @Override 
    public String getSchemaFile() { 
     return "solr/conf/schema.xml"; 
    } 

    @Override 
    public String getSolrConfigFile() { 
     return "solr/conf/solrconfig.xml"; 
    } 

    @Before 
    @Override 
    public void setUp() throws Exception { 
     super.setUp(); 
     server = new EmbeddedSolrServer(h.getCoreContainer(), h.getCore().getName()); 
    } 

    @Test 
    public void testThatNoResultsAreReturned() throws SolrServerException { 
     SolrParams params = new SolrQuery("text that is not found"); 
     QueryResponse response = server.query(params); 
     assertEquals(0L, response.getResults().getNumFound()); 
    } 

    @Test 
    public void testThatDocumentIsFound() throws SolrServerException, IOException { 
     SolrInputDocument document = new SolrInputDocument(); 
     document.addField("id", "1"); 
     document.addField("name", "my name"); 

     server.add(document); 
     server.commit(); 

     SolrParams params = new SolrQuery("name"); 
     QueryResponse response = server.query(params); 
     assertEquals(1L, response.getResults().getNumFound()); 
     assertEquals("1", response.getResults().get(0).get("id")); 
    } 
} 

更多信息请参阅本博文:Solr Integration Tests

+1

我会用一个新的答案告诉所有的答案:这是 - 如果你使用的是junit 4.7,你可以使用这种方法。如果您现在使用更高的JUnit,则不能。 – jayunit100 2012-02-02 17:19:39

5

首先,您需要设置包含含有solrconfig solr.xml和conf文件夹你的Solr的主目录。 xml,schema.xml等。

之后,你可以使用这个简单和基本的代码为Solrj。

File solrHome = new File("Your/Solr/Home/Dir/"); 
File configFile = new File(solrHome, "solr.xml"); 
CoreContainer coreContainer = new CoreContainer(solrHome.toString(), configFile); 
SolrServer solrServer = new EmbeddedSolrServer(coreContainer, "Your-Core-Name-in-solr.xml"); 
SolrQuery query = new SolrQuery("Your Solr Query"); 
QueryResponse rsp = solrServer.query(query); 
SolrDocumentList docs = rsp.getResults(); 
Iterator<SolrDocument> i = docs.iterator(); 
while (i.hasNext()) { 
     System.out.println(i.next().toString()); 
} 

我希望这会有所帮助。