当前位置: 首页 > 知识库问答 >
问题:

InjectMocks错误地将相同的模拟注入到两个类型相似的不同字段中,尽管创建了两个不同的模拟

匡玉堂
2023-03-14

我有一个类,它有两个类似类型的字段。我嘲笑过他们两个。但是当我使用InjectMocks时,InjectMocks错误地将单个模拟注入到这两个字段中。

下面是示例代码类:


import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;

import java.util.Set;
import java.util.function.Consumer;

@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class TestClass {

    private final Consumer<Set<Integer>> intConsumer;

    private final Consumer<Set<String>> stringConsumer;

    void PrintClass(){
        System.out.println("intConsumers: " + intConsumer);
        System.out.println("stringConsumers: " + stringConsumer);
    }
}

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

import java.util.Set;
import java.util.function.Consumer;

@RunWith(MockitoJUnitRunner.class)
public class TestClassTest {

    @Mock private Consumer<Set<Integer>> intConsumer;
    @Mock private Consumer<Set<String>> stringConsumer;
    @InjectMocks private TestClass testClass;

    @Test
    public void testPrint(){
        testClass.PrintClass();
    }


}

下面是我运行测试时的输出:testPrint()-intConsumer被注入到intConsumer和StringConsumer中。

intConsumers: intConsumer
stringConsumers: intConsumer



Process finished with exit code 0

我正在使用Maven。

<dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>2.7.19</version>
</dependency>

我创建了这个私有构造函数,专门用于使用InjectMocks进行测试。我不想将其公有/包私有,因此我不能使用字段注入。我也不想使用公共设置器公开这些字段。此外,我不想使我的领域非最终。

共有1个答案

丘学海
2023-03-14

这是Mockito中一个公开的bug。

在我看来,PropertyAndSetterInjection将泛型类型和@mock的name属性考虑在内,因此它在字段注入方面的工作与预期一样。但它不能用于构造函数,因为ConstructorInjection仅使用SimpleArgumentResolver,而SimpleArgumentResolver很好地.非常简单,不像属性注入器那样有任何MockCandidateFilter。

  • 泛型和mock#1056存在问题
  • @injectmocks忽略@mock的泛型类型#1066的名称
    null

在这种情况下,您可以使用反射来构建实例:

@Before
public void setUp() throws IllegalAccessException, 
        InvocationTargetException, 
        InstantiationException,
        NoSuchMethodException {
    final Constructor<TestClass> constructor = TestClass.class.getDeclaredConstructor(Consumer.class, Consumer.class);
    constructor.setAccessible(true);
    testClass = constructor.newInstance(intConsumer, stringConsumer);
}
 类似资料:
  • 我使用一个Android库,它要求我创建两个类,每个类继承自不同的类 (具有公共基类) 现在我有这个代码: 我必须复制这个类来创建一个扩展,即使我的两个类共享完全相同的代码。 我简化了示例的代码,但重复可能很重要 我决定将代码放在这两个类之外的静态方法中,并在类重写的方法中调用它们,但我认为必须有一种更干净的方法来做到这一点。 你能帮我解决这个问题吗? 和都继承自。

  • 我正在使用Mockito编写单元测试,但我在模仿注入的类时遇到了问题。问题是两个注入的类是相同的类型,仅通过它们的注释来区分。如果我试图简单地模拟,那么在我的测试中,该模拟不会被注入,并且该对象为。我如何模拟这些对象?

  • 但是我有两种回购方式 如何创建两个bean,其中一个是用注入的,另一个是用注入的?

  • 问题内容: 看这个: 现在,我有了一些值和一个从文件中加载的值的实例化。我希望将两个结构合并到一起,以便同时获取两个结构的内容。应该覆盖设置的任何内容,而 可能没有设置所有的字段 。(为什么?因为潜在的用户可能不知道默认值,所以删除该条目等同于设置默认值-我认为) 我认为我需要对此进行反思: 在这里我不确定: 如果根本需要反思 可能有更简单的方法可以做到这一点 我在这里看到的另一个问题是检查零值可

  • 输出如下:http://imgur.com/a/nu3n6

  • 我有一个类,它有两个相同类型的最终字段,我需要在第二个字段中注入if属性