Mockito InjectMocks с новыми инициализированными переменными класса - PullRequest
0 голосов
/ 19 мая 2018

Как это вообще работает?Насколько я понимаю, этого не должно быть.LDAPGroupAccessor инициализируется заново в классе или может быть инициализирован заново в самом конструкторе, он не внедряется, не является аргументом конструктора или инъекцией пружинного компонента.

Я знаю, что это возможно с помощью отражения, но как injectMocks вводит его?Разве это не разрушает цель DI?

@Component
public class AuthorizationHandler {

    private LDAPGroupAccessor groupAccessor = new LDAPGroupAccessor();

    public isUserAuthorized(String userId, String groupId){
        return groupAccessor.isUserInGroup(userId, ldapGroup);
    }
}

public class AuthorizationHandlerTest {

    @InjectMocks
    private AuthorizationHandler authorizationHandler;

    @Mock
    private LDAPGroupAccessor groupAccessor = new LDAPGroupAccessor();

    @Before
    public void setup() {
        String authorizedUser = "authorizedUser";
        Mockito.when(groupAccessor.isUserInGroup("authorizedUser", "someGroup")).thenReturn(true);
    }

    @Test
    public void test1() {
        Assert.assertEquals(true, authorizationHandler.isUserAuthorized("authorizedUser", "someGroup"));
    }
}

1 Ответ

0 голосов
/ 19 мая 2018

Используется только полевая инъекция документация

Полевой впрыск ;Сначала mocks будет разрешаться по типу (если внедрение совпадения одного типа будет происходить независимо от имени), а затем, если существует несколько свойств одного типа, путем сопоставления имени поля и имени mock.

Итак, шаги:

  1. AuthorizationHandler создается
  2. Инициализатор экземпляра называется
  3. LDAPGroupAccessorзапускается и присваивается groupAccessor
  4. @InjectMocks и заменяет экземпляр, выделенный для groupAccessor, @Mock
...