Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java InjectMocks错误地将相同的Mock注入到2个不同的相似类型字段中,尽管创建了2个不同的Mock_Java_Maven_Junit_Mockito_Inject - Fatal编程技术网

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

Java InjectMocks错误地将相同的Mock注入到2个不同的相似类型字段中,尽管创建了2个不同的Mock,java,maven,junit,mockito,inject,Java,Maven,Junit,Mockito,Inject,我有一个类,它有两个类似类型的字段。我嘲笑了他们两个。但是当我使用injectmock时,injectmock错误地将一个mock注入到这两个字段中 下面是示例代码类: import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import java.util.Set; import java.util.function.Consumer; @RequiredArgsConstructor(access = Acce

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

下面是示例代码类:


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);
    }
}
我正在使用Maven

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

org.mockito
莫基托磁芯
2.7.19
我创建了这个私有构造函数,专门用于使用InjectMock进行测试。我不想将其公开/包私有,因此我不能使用字段注入。我也不想使用公共setter公开这些字段。另外,我不想让我的字段成为非最终字段

我已经尝试将mockito版本升级到3.5.10,但是它仍然有这个bug。 我还尝试将我的字段设置为最终字段,并使用setter——然后注入就可以了——但我不想暴露我的setter。 我也尝试过用构造函数注入来命名Mock@Mock(name=“Mock”),但效果并不理想


我是不是遗漏了什么?有没有办法让它与私有构造函数注入一起工作?

这是Mockito中的一个开放bug

据我所见,PropertyAndSetterInjection考虑了泛型类型和@Mock的name属性,因此它与字段注入的预期效果一样。但它不适用于构造函数,因为ConstructorInjection只使用SimpleArgumentResolver,它很好地。。。非常简单,没有任何类似属性注入器的MockCandidateFilter

通常,您会:

  • 在test中的setup方法中删除@injectmock并构造TestClass实例。这是一种侵入性较小的方法
  • 或者,如上所述,现场和设定器注射工作
这两种方法都不适用于您的约束(私有构造函数、无设置器、最终字段)

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

@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);
}
@之前
public void setUp()引发IllegalAccessException,
调用targetException,
实例化异常,
NoSuchMethodException{
最终构造函数=TestClass.class.getDeclaredConstructor(Consumer.class,Consumer.class);
constructor.setAccessible(true);
testClass=constructor.newInstance(intConsumer、stringConsumer);
}
<dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>2.7.19</version>
</dependency>
@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);
}