2014-02-19 32 views
0

我想测试MessageProcessor1.listAllKeyword的方法,而这又将 调用HbaseUtil1.getAllKeyword方法。最初,我不得不处理与静态初始化器和构造器相关的问题。问题是初始化一个HBASE DB连接。我使用powerMock来抑制静态和构造函数调用,它工作正常。easymock预计不工作,仍然调用实际方法

即使我嘲笑HbaseUtil1.getAllKeyword方法,实际的方法正在被调用,并执行所有的HBase代码导致一个异常,其中HBASE服务器没有启动。 EasyMock.expect(hbaseUtil.getAllKeyword("msg", "u1")).andReturn(expectedList);

请给我任何想法如何避免实际的方法调用。我尝试了很多方法,但都没有工作。

public class MessageProcessor1 
{ 
    private static Logger logger = Logger.getLogger("MQ-Processor"); 
    private final static String CLASS_NAME = "MessageProcessor"; 
    private static boolean keywordsTableExists = false; 
    public static PropertiesLoader props; 
    HbaseUtil1 hbaseUtil; 
    /** 
    * For checking if table exists in HBase. If doesn't exists, will create a 
    * new table. This runs only once when class is loaded. 
    */ 
    static { 
     props = new PropertiesLoader(); 
     String[] userTablefamilys = { 
       props.getProperty(Constants.COLUMN_FAMILY_NAME_COMMON_KEYWORDS), 
       props.getProperty(Constants.COLUMN_FAMILY_NAME_USER_KEYWORDS) }; 
     keywordsTableExists = new HbaseUtil() 
     .creatTable(props.getProperty(Constants.HBASE_TABLE_NAME), 
       userTablefamilys); 
    } 

    /** 
    * This will load new configuration every time this class instantiated. 
    */ 
    { 
     props = new PropertiesLoader(); 
    } 

    public String listAllKeyword(String userId) throws IOException { 
     HbaseUtil1 util = new HbaseUtil1(); 
     Map<String, List<String>> projKeyMap = new HashMap<String, List<String>>(); 
     //logger.info(CLASS_NAME+": inside listAllKeyword method"); 
     //logger.debug("passed id : "+userId); 
     List<String> qualifiers = util.getAllKeyword("msg", userId); 

     List<String> keywords = null; 
     for (String qualifier : qualifiers) { 
      String[] token = qualifier.split(":"); 

      if (projKeyMap.containsKey(token[0])) { 
       projKeyMap.get(token[0]).add(token[1]); 
      } else { 
       keywords = new ArrayList<String>(); 
       keywords.add(token[1]); 
       projKeyMap.put(token[0], keywords); 
      } 
     } 

     List<Project> projects = buildProject(projKeyMap); 
     Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation() 
       .create(); 
     System.out.println("Json projects:::" + gson.toJson(projects)); 
     //logger.debug("list all keyword based on project::::"+ gson.toJson(projects)); 
     //return gson.toJson(projects); 
     return "raj"; 
    } 

    private List<Project> buildProject(Map<String, List<String>> projKeyMap) { 

     List<Project> projects = new ArrayList<Project>(); 
     Project proj = null; 
     Set<String> keySet = projKeyMap.keySet(); 
     for (String hKey : keySet) { 
      proj = new Project(hKey, projKeyMap.get(hKey)); 
      projects.add(proj); 

     } 
     return projects; 
    } 

    //@Autowired 
    //@Qualifier("hbaseUtil1") 
    public void setHbaseUtil(HbaseUtil1 hbaseUtil) { 
     this.hbaseUtil = hbaseUtil; 
    } 

} 



public class HbaseUtil1 { 

    private static Logger logger = Logger.getLogger("MQ-Processor"); 
    private final static String CLASS_NAME = "HbaseUtil"; 
    private static Configuration conf = null; 

    public HbaseUtil1() { 
     PropertiesLoader props = new PropertiesLoader(); 
     conf = HBaseConfiguration.create(); 
     conf.set(HConstants.ZOOKEEPER_QUORUM, props 
       .getProperty(Constants.HBASE_CONFIGURATION_ZOOKEEPER_QUORUM)); 
     conf.set(
       HConstants.ZOOKEEPER_CLIENT_PORT, 
       props.getProperty(Constants.HBASE_CONFIGURATION_ZOOKEEPER_CLIENT_PORT)); 
     conf.set("hbase.zookeeper.quorum", props 
       .getProperty(Constants.HBASE_CONFIGURATION_ZOOKEEPER_QUORUM)); 
     conf.set(
       "hbase.zookeeper.property.clientPort", 
       props.getProperty(Constants.HBASE_CONFIGURATION_ZOOKEEPER_CLIENT_PORT)); 
    } 

    public List<String> getAllKeyword(String tableName, String rowKey) 
      throws IOException { 
     List<String> qualifiers = new ArrayList<String>(); 
     HTable table = new HTable(conf, tableName); 
     Get get = new Get(rowKey.getBytes()); 
     Result rs = table.get(get); 

     for (KeyValue kv : rs.raw()) { 

      System.out.println("KV: " + kv + ", keyword: " 
        + Bytes.toString(kv.getRow()) + ", quaifier: " 
        + Bytes.toString(kv.getQualifier()) + ", family: " 
        + Bytes.toString(kv.getFamily()) + ", value: " 
        + Bytes.toString(kv.getValue())); 
      qualifiers.add(new String(kv.getQualifier())); 
     } 
     table.close(); 
     return qualifiers; 

    } 
    /** 
    * Create a table 
    * 
    * @param tableName 
    *   name of table to be created. 
    * @param familys 
    *   Array of the name of column families to be created with table 
    * @throws IOException 
    */ 
    public boolean creatTable(String tableName, String[] familys) { 
     HBaseAdmin admin = null; 
     boolean tableCreated = false; 
     try { 
      admin = new HBaseAdmin(conf); 
      if (!admin.tableExists(tableName)) { 
       HTableDescriptor tableDesc = new HTableDescriptor(tableName); 
       for (int i = 0; i < familys.length; i++) { 
        tableDesc.addFamily(new HColumnDescriptor(familys[i])); 
       } 
       admin.createTable(tableDesc); 
       System.out.println("create table " + tableName + " ok."); 
      } 
      tableCreated = true; 
      admin.close(); 
     } catch (MasterNotRunningException e1) { 
      e1.printStackTrace(); 
     } catch (ZooKeeperConnectionException e1) { 
      e1.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return tableCreated; 
    } 

} 

Below is my Test class. 

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MessageProcessor1.class) 
@SuppressStaticInitializationFor("com.serendio.msg.mqProcessor.MessageProcessor1") 
public class MessageProcessorTest1 { 

    private MessageProcessor1 messageProcessor; 
    private HbaseUtil1 hbaseUtil; 

    @Before 
    public void setUp() { 
     messageProcessor = new MessageProcessor1(); 
     hbaseUtil = EasyMock.createMock(HbaseUtil1.class); 
    } 


    @Test 
    public void testListAllKeyword(){ 
     List<String> expectedList = new ArrayList<String>(); 
     expectedList.add("raj:abc"); 
     suppress(constructor(HbaseUtil1.class)); 
     //suppress(method(HbaseUtil1.class, "getAllKeyword")); 

     try { 
      EasyMock.expect(hbaseUtil.getAllKeyword("msg", "u1")).andReturn(expectedList); 
      EasyMock.replay(); 
      assertEquals("raj", messageProcessor.listAllKeyword("u1")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     }catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

回答

0

HbaseUtil1listAllKeyword方法

public String listAllKeyword(String userId) throws IOException { 
    HbaseUtil1 util = new HbaseUtil1(); 
    ... 

所以,你在你的测试创建模拟一个没有被使用在所有中被实例化。 如果可能,使HbaseUtil1对象可通过,或在MessageProcessor1类上设置,然后将其设置在测试类中。

此外,请注意我对PowerMock不是100%熟悉,您可以在准备测试注释时包含HbaseUtil1。我认为这将使PowerMock实例化模拟而不是真实对象,然后使用您在测试中提供的期望。

+0

@ user3327151 是否有任何理由需要为此方法实例化单独的'HbaseUtil1'呢?如果'MessageProcessor1'已经有一个集合,则不需要实例化一个新集合并使用该集合。 我会从'listAllKeyword'方法中删除'HbaseUtil1 util = new HbaseUtil1();'并且使用'MessageProcessor1'中的'hbaseUtil',所以你得到'List qualifiers = hbaseUtil.getAllKeyword(“msg”,userId )'然后在测试类中,添加'messageProcessor.setHbaseUtil(hbaseUtil);'作为'setUp'方法的最后一行。 –

+0

我通过'HbaseUtil1'作为setter,它工作正常。它现在不调用真正的方法,但它给予'限定符'的空点异常。 // // HbaseUtil1 util = new HbaseUtil1(); Map > projKeyMap = new HashMap >(); 列表限定符= hbaseUtil.getAllKeyword(“msg”,userId); \t \t列表 keywords = null; \t \t为(字符串限定符:限定符){ \t \t \t字符串[]标记= qualifier.split( “:”);' – user3327151

+0

感谢乌尔帮助BRO ..但仍然测试未通过bcoz空值返回到'qualifiers'。你能找到我的错在哪里吗? – user3327151

相关问题