2013-07-19 9 views
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». string к аргументу, переданному ему, и возвращать полученную строку любое количество раз независимо от переданного аргумента и количества раз, когда метод вызывается.Как издеваться над методом, возвращающим строку с добавлением аргумента (java) с использованием powermock

ответ

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.

+0

Ой, я просто понял, что вы использовали Powermock, а не Mockito! –

0

Лучше всего было бы воспользоваться matchers предоставленного 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 
} 

Это не сильно отличается от @ ответа Аюба в. Основное различие заключается в использовании 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 
} 

Это идет немного выше, и за то, что вам нужно, но может быть полезно, особенно при перемещении annonymous внутреннего класса с внутренним классом и повторное поведение через несколько тестов.

Смежные вопросы