2015-01-12 4 views
0

У меня есть класс LoggerInterceptor с InvocationContext в качестве параметра. Для этого класса я пытаюсь написать модульный тест, но я застрял на первой линии:Mockito UnfinishedStubbingException при попытке издеваться над классом

public class LoggerInterceptor{ 
    public method log(InvocationContext context) { 
    String name = invocationContext.getTarget().getClass().getName(); 
    ..... 
    } 

Мой тест выглядит следующим образом:

@Test 
public void logTest() throws Exception { 
    LoggerInterceptor objectToTest = new LoggerInterceptor(); 

    InvocationContext context = Mockito.mock(InvocationContext.class); 
    Object target = Mockito.mock(Object.class); 
    Mockito.when(context.getTarget()).thenReturn(target); 

    MockGateway.MOCK_GET_CLASS_METHOD = true; 

    Mockito.doReturn(objectToTest.getClass()).when(target).getClass(); 

    MockGateway.MOCK_GET_CLASS_METHOD = false; 

    objectToTest.log(context); 
} 

Я получаю UnfinishedStubbingException когда я называю метод log (контекст).

Если я пытаюсь с:

Mockito.when(target.getClass()).thenReturn(objectToTest.getClass()); 

Я получаю это исключение:

The method thenReturn(Class<capture#3-of ? extends Object>) in the type OngoingStubbing<Class<capture#3-of ? extends Object>> is not applicable for the arguments (Class<capture#4-of ? extends LoggerInterceptor>) 

Есть ли способ, что я могу пройти эту первую линию? Строка, которую я возвращаю, не важна.

+0

Пожалуйста, введите код 'invocationContext.getTarget()'. – BetaRide

+0

getTarget() - это метод в интерфейсе InvocationContext. У меня нет конкретной реализации этого метода – schmimona

ответ

3

Object.getClass() является окончательным. Заключительные методы не могут быть издевательствами или заглушены Mockito, потому что компилятор видит «final», пропускает отправку виртуального метода, и поэтому Mockito не может перехватывать вызовы к методу или не идентифицировать метод в doReturn, when или verify. Когда вы взаимодействуете с Mockito позже, он обнаруживает, что вы начали выполнять stubbing, но не можете обнаружить, что вы закончили, поэтому он генерирует исключение UnfinishedStubbingException.

Если вы хотите, чтобы target отредактировал его тип или тип, вам нужно будет изменить объект класса, переданный в Mockito.mock, или добавить withSettings().extraInterfaces(...).