Вопрос по mockito – Насмешка над двумя объектами одного типа с Mockito

8

пишу юнит-тесты, используя Mockito и I 'У меня проблемы с насмешкой над введенными классами. Проблема в том, что два внедренных класса имеют одинаковый тип и различаются только по@Qualifier аннотаций. Если бы я попытался просто издеватьсяSomeClass.class, этот макет не вводится, и этот объектnull в моих тестах. Как я могу издеваться над этими объектами?

public class ProfileDAL {

    @Inject
    @Qualifier("qualifierA")
    private SomeClass someClassA ;

    @Inject
    @Qualifier("qualifierB")
    private SomeClass someClassB ;

    //...various code, not important
}

@RunWith(MockitoJUnitRunner.class)
public class ProfileDALLOMImplTest {

    @InjectMocks
    private ProfileDALLOMImpl profileDALLOMImpl = new ProfileDALLOMImpl();

    @Mock
    private SomeClass someClassA;
    @Mock
    private SomeClass someClassB;

    private SomeResult mockSomeResult = mock(SomeResult.class);

    @Test
    public void testSomeMethod() {
        when(someClassA .getSomething(any(SomeArgment.class)).thenReturn(mockSomeResult);
        Int result = profileDALLOMImpl.someTest(This isn't relevant);
    }

 }
Не могли бы вы продемонстрировать внедрение этих зависимостей без использования @InjectMocks? Я обновил свой Q, чтобы продемонстрировать, как настроен мой тест. tamuren
Как выглядит ваш тестовый код? Я всегда явно звонюMockito.mock(SomeClass.class) создавать мои издевательства, не допуская моих юнит-тестов к любой магии, предоставленной аннотациями. Вы должны быть в состоянии сделать то же самое, если вводите свои зависимости через конструктор или сеттеры. Есть ли для этого веская причина?не так ли? rcomblen

Ваш Ответ

3   ответа
9

9.5 с помощью JUnit, и это работает.

Увидеть:http://static.javadoc.io/org.mockito/mockito-core/1.9.5/org/mockito/InjectMocks.html

Соответствующая информация о типе из документа:

Полевая инъекция; Сначала mocks будут разрешаться по типу, а затем, если есть несколько свойств одного типа, по совпадению имени поля и имени mock. "

И этот, который, кажется, говорит, что вы должны сделать так, чтобы имя макета совпадало с именем поля для всех ваших макетов, когда у вас есть два одинаковых типа: "

Примечание 1: если у вас есть поля с одинаковым типом (или стиранием),лучше назвать все@Mock аннотированные поля с соответствующими полями, в противном случае Mockito может запутаться, и инъекция выиграетне бывает. "

Возможно, этот последний кусает тебя?

1

на что указал Splonk, и он работает таким образом в Mockito 1.9.5, как только я удалил один из высмеиваемых классов, он потерпел неудачу.

Итак, в вашем случае, убедитесь, что у вас есть оба ложных класса с тем же именем, что и в классе в вашем тесте:

@Mock
private SomeClass someClassA;
@Mock
private SomeClass someClassB;
0

Если вы нет аннотации, вы получите что-то вроде

public class MyClass {
    private MyDependency myDependency;

    public void setMyDependency(MyDependency myDependency){
        this.myDependency = myDependency;
    }
}

а также

import org.junit.Before;
import org.junit.Test;

import static org.mockito.Mockito.*;

public class MyTest {

    private MyClass myClass;
    private MyDependency myDependency;

    @Before
    public void setUp(){
        myClass = new MyClass();
        myDependency = mock(MyDependency.class);
        myClass.setMyDependency(myDependency);
    }

    @Test
    public void test(){
        // Given

        // When

        // Then
    }
}

Вы можете сделать то же самое, если ваш объект имеет свои зависимости, определенные через конструктор, а не через setter. Я предполагаю, что ваша структура внедрения зависимостей может аннотировать сеттеры так же, как вы аннотируете частные поля, но теперь ваши тесты нене полагайтесь на любую структуру внедрения зависимости.

Я могу'не поддаваться использованию инфраструктуры внедрения зависимостей. Это'Это дизайнерское решение не в моих руках. tamuren

Похожие вопросы