2016-12-18 2 views
1

у меня есть класс под тест которого Constructer выглядит следующим образом:Как написать модульные тесты для классов с CheckedProviders в своих конструкторах

public class ClassUnderTest { 

ClientOne clientOne; 
ClientTwo clientTwo; 
OtherDependency otherDependency; 

@Inject 
public ClassUnderTest(MyCheckedProvider<ClientOne> myCheckedProviderOne, 
        MyCheckedProvider<ClientTwo> myCheckedProviderTwo, 
        OtherDependency otherDependency) throws Exception { 
     this.clientOne = myCheckedProviderOne.get(); 
     this.clientTwo = myCheckedProviderTwo.get(); 
     this.otherDependency = otherDependency; 
    } 
    . 
    . 
    . 
} 

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

public interface MyCheckedProvider<T> extends CheckedProvider<T> { 

    @Override 
    T get() throws Exception; 

} 

я мог издеваться клиенты, но как мне инициализировать поставщиков с моими издеваемыми клиентами. Я использую комбинацию junit и mockito для написания тестов. Все данные будут оценены.

ответ

1

Что вы можете сделать, это издеваться над поставщиками, а не с клиентами. ClientOne и ClientTwo являются типами, вы переходите в свой общий класс, это не переменные и, следовательно, не то, что вы хотите высмеять. Напротив, поставщики, которые вы передаете конструктору, действительно являются переменными, и то, что вам нужно контролировать (имитировать), - это поведение этих переменных.

public class ClassTest { 

    private static final CientOne CLIENT_ONE = new ClientOne(); 
    private static final ClientTwo CLIENT_TWO = new ClientTwo(); 

    @Mock 
    private MyCheckedProvider<ClientOne> providerOne; 

    @Mock 
    private MycheckedProvider<ClientTwo> providerTwo; 

    private ClassUnderTest classUnderTest; 

    @Before 
    public void setUp() { 
     when(providerOne.get()).thenReturn(CLIENT_ONE); 
     when(providerTwo.get()).thenReturn(CLIENT_TWO); 
     classUnderTest = new ClassUnderTest(providerOne, providerTwo, otherDependency); 
    } 
} 
+0

Благодаря @Jenson, это сработало! –

1

Как следует из другого ответа, вы также можете легко издеваться над поставщиками.

Но вам не нужен.

У вас уже есть интерфейс сидит там, так что бы помешать вам создать что-то вроде

class MyCheckedProviderImpl<T> implements MyCheckedProvider<T> { 

и мозговым принимает объект T в своем конструкторе и возвращает именно это?

Это более или менее то же, что и насмешка.

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