Mockito InjectMocks具有新的初始化类变量

时间:2018-05-19 10:04:58

标签: java spring unit-testing dependency-injection mockito

这怎么工作? 根据我的理解,它不应该有。 LDAPGroupAccessor是在类中新初始化的,或者可以在构造函数本身中初始化,它不是被注入,不是构造函数参数,不是spring bean注入。

我知道有可能使用反射,但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 :(得分:2)

它只使用field injection。来自the documentation

  

现场注射; mocks将首先按类型解析(如果单个类型匹配注入将发生而不管名称如何),那么,如果有多个相同类型的属性,则通过匹配字段名称和模拟名称。

所以步骤是:

  1. AuthorizationHandler已实例化
  2. 实例初始化程序称为
  3. 创建LDAPGroupAccessor并将其分配给groupAccessor
  4. @InjectMocks使用groupAccessor
  5. 运行并替换分配给@Mock的实例