2016-10-31 2 views
3

У меня есть код, похожий на этотКак я могу назвать фактический конструктор объекта mockito mockito?

class superClass{ 
    public String transform(String str); 
    //lots of logic including ajax calls 
    return("Modified"+str); 
} 

class baseClass extends superClass{ 
    private fetchData; 
    baseClass(FetchData fetchData){ 
    this.fetchData = fetchData; 
} 

public String parse() 
    str = fetchData.get(); 
    //some more logic to modify str 
    return transform(str); 
} 

и я использую Mockito и JUnit, чтобы проверить его. Я насмешливый baseClass и делать что-то вроде этого

baseClass baseMock = Mockito.mock(baseClass.class); 
Mockito.when(baseMock.parse()).thenCallRealMethod(); 
Mockito.when(baseMock.transform()).thenReturn("Something"); 

Как я могу привнести макет fetchData, как он вводится через конструктор?

+0

вы не можете. Вы должны либо использовать отражение, либо выставить сеттер в своем базовом классе. – SMA

+1

Что вы тестируете, 'baseClass'? Если это так, я думаю, вы можете не понимать, как тестировать. Если вы хотите протестировать 'baseClass', вы бы не издевались над ним. Вы издеваетесь над тем, что требует, чтобы его не тестировали. Если вы хотите издеваться над 'FetchData', вы можете легко сделать это, передав' baseClass' другую реализацию FetchData (макет). Кроме того, ваше именование немного испорчено. Суперкласс - это базовый класс. Ваш 'baseClass' должен быть' DerivedClass', и ваши имена классов должны начинаться с заглавной буквы. И, пожалуйста, правильно отформатируйте свой код, он также не компилируется, как сейчас. –

+0

Подсказка: имена классов java переходят в UpperCase. Всегда. – GhostCat

ответ

6

Вы можете использовать Mockito.spy (http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#spy):

baseClass object = new baseClass(new FetchData()); 
baseClass spy = Mockito.spy(object); 

Mockito.when(spy.parse()).thenCallRealMethod(); 
Mockito.when(spy.transform()).thenReturn("Something"); 
+0

Удивительный, это работает спасибо :) один вопрос, как я могу назвать фактический метод с синтаксисом do, потому что 'Mockito.when (spy.parse()). ThenCallRealMethod(); ' вызывает фактический метод, когда эта макетная строка выполняется, я хочу, чтобы метод вызывался только тогда, когда я вызываю spy.parse() –

+1

' Mockito.doCallRealMethod(). Когда (). (); 'Однако, пожалуйста, посмотрите сообщение @GhostCat ниже. То, что вы пытаетесь проверить, не имеет смысла. Или, если вы просто пытаетесь протестировать абстрактный базовый класс, возможно, не используйте mockito. Создайте подкласс в своем тестовом классе и используйте это. –

1

Ваша проблема носит иной характер: вы создали трудно проверить код. Это дело с конструкторами: нужно быть очень осторожным в том, что они делают.

Другое дело, что вы прямо «побежали» в «предпочитаете композицию над наследованием». Может возникнуть соблазн просто расширить какой-то другой класс, чтобы наследовать какое-то полезное поведение, но когда вы это делаете, вы выполняете именно такие проблемы!

My kinda non-answer: шаг назад, и внимательно изучите ваш дизайн, если это действительно лучшее решение. Возможно, вы сначала наблюдаете за этими videos, чтобы понять, о чем я говорю. Если у вас есть опытные люди, поговорите с ними; и попросите их ознакомиться с вашим дизайном.

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