【问题标题】:How to mock a method to return a string appended with its argument(java) using powermock如何使用powermock模拟方法以返回附加其参数(java)的字符串
【发布时间】:2013-07-19 09:36:42
【问题描述】:
public class abc{
public getTable(String table){
    //some complex logic here.//to be skipped while testing
    return "schemaName." + table;
}

public buildQueryMethod1(){
    String sql = "select fields from "+getTable("table1") +
                "union" +
                "select fields from " + getTable("table2") +
                .
                .
                .
    return sql;
}
 }

我想测试 buildQueryMethod1()。如何模拟 getTable 方法以使其返回“ABC”。字符串到传递给它的参数,并返回结果字符串任意次数,与传递的参数和方法被调用的次数无关。

【问题讨论】:

    标签: java testng mockito easymock powermock


    【解决方案1】:

    即使您应该注入一个单独的类来生成表名,您可以使用 Mockito 的 spy 功能。看起来您的代码无法编译,但在您的测试中执行以下操作:

    public class ExampleTest() {
    
        private abc example = new abc();
    
        @Test
        public void test() {
            abc spy1 = spy(abc);
    
            stub(spy1. getTable("table1")).toReturn("ABC");
            stub(spy1. getTable("table2")).toReturn("ABC")
    
            // do some testing on example...
        }
    }
    

    您必须导入 Mockito 静态存根和 spy 方法。

    【讨论】:

    • 糟糕,我刚刚意识到您使用的是 Powermock,而不是 Mockito!
    【解决方案2】:

    最好的方法是利用 Mockito 提供的匹配器:

    @Test
    public void test() {
       abc spyInstance = PowerMockito.spy(abc); //Since it's a public method
                                                //you can probably just use
                                                //Mockito here.
       doReturn("ABC.").when(abc).getTable(org.mockito.Matchers.anyString());
    
       //do some testing
    }
    

    这与@Ayub 的回答没有太大区别。主要区别在于anyString()的使用。

    有时返回传递给方法的参数很有用。

    @Test
    public void test() {
       abc spyInstance = PowerMockito.spy(abc); //Since it's a public method
                                                //you can probably just use
                                                //Mockito here.
       doAnswer(new Answer<String>() {
          @Override
          public String answer(InvocationOnMock invocation) throws Throwable {
             return (String)invocation.getArguments()[0];
          }
       }).when(abc).getTable(org.mockito.Matchers.anyString());
    
       //do some testing
    }
    

    这有点超出您的需要,但可能很有用,尤其是当您将匿名内部类移动到内部类并在多个测试中重用该行为时。

    【讨论】:

      猜你喜欢
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多