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

4

2 回答 2

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

于 2013-07-19T10:10:27.973 回答
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
}

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

于 2013-07-19T19:23:04.550 回答