如何使用powermock模拟一个方法返回附加了参数(java)的字符串

时间:2013-07-19 09:36:43

标签: java testng mockito easymock powermock

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”。传递给它的参数的字符串,并返回结果字符串任意次数,与传递的参数和调用方法的次数无关。

2 个答案:

答案 0 :(得分:0)

即使你应该在一个单独的类中注入以生成表名,你也可以使用Mockito的间谍功能。看起来你的代码不会编译,但是在你的测试中做了类似的事情:

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静态存根和间谍方法。

答案 1 :(得分:0)

最好的方法是利用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
}

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