【问题标题】:Mockito InjectMocks with new Initialized Class Variables带有新的初始化类变量的 Mockito InjectMocks
【发布时间】:2018-10-29 15:30:53
【问题描述】:

这甚至是如何工作的? 根据我的理解,它不应该有。 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"));
    }
}

【问题讨论】:

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


    【解决方案1】:

    它只使用field injection。来自the documentation

    字段注入; mocks 将首先通过类型解析(如果无论名称如何都会发生单个类型匹配注入),然后,如果有多个相同类型的属性,则通过字段名称和模拟名称的匹配。

    所以步骤是:

    1. AuthorizationHandler 被实例化
    2. 实例初始化器被调用
    3. LDAPGroupAccessor 已创建并分配给 groupAccessor
    4. @InjectMocks 运行并将分配给groupAccessor 的实例替换为@Mock

    【讨论】:

    • 我认为 mockito 只会在 LDAPGroupAccessor 被字段注入的情况下进行字段注入,即:@Autowired private LDAPGroupAccessor groupAccessor;
    • Mockito 与 Spring 无关!你从@G8XSU 那里得到这个想法的? @InjectMocks 不是 DI 框架,它是一种使单元测试更容易的实用程序 - 因此它不尊重或关心 DI 注释,尤其是来自特定框架的那些注释 - 例如 Spring。
    • 好的,我同意,但我认为理想的方法是让 LDAPGroupAccessor 也成为一个组件,然后自动装配它,将其注入测试用例。这里唯一的优势是:“很明显 AuthorizationHandler 期望 groupAccessor 被外部注入”并且没有其他好处?
    • 这不是我可以为你做的决定——我不知道这段代码是做什么的,你要求对行为进行解释,你得到了它......不过,一般来说,是的 - 它几乎总是最好在ctor中获取依赖项并将其声明为private final(你的不是final);因为在 ctors 中实例化事物会导致紧密耦合、无法测试的代码。
    • 在这种特殊情况下,即使它是 ctor 初始化的,injectMocks 仍然会注入它。我不确定它是如何使其紧密耦合或无法测试的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    相关资源
    最近更新 更多