easymock期望不工作,仍然调用实际方法

时间:2014-02-19 09:31:37

标签: java hbase easymock

我想测试MessageProcessor1.listAllKeyword方法,反过来 调用HbaseUtil1.getAllKeyword方法。最初,我不得不处理与静态初始化器和构造函数相关的问题。问题是初始化HBASE DB连接。我使用powerMock来抑制静态和构造函数调用,它运行正常。

即使我模拟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();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

HbaseUtil1方法

中实例化listAllKeyword
 public String listAllKeyword(String userId) throws IOException {
     HbaseUtil1 util = new HbaseUtil1();
     ...

因此,您在测试中创建的模拟文件根本没有被使用。 如果可能,使HbaseUtil1对象可以在MessageProcessor1类上设置或设置,然后在测试类中设置它。

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