java - 如何模拟具有两种不同实现的接口(interface)

标签 java spring unit-testing junit mockito

<分区>

我有一个我需要测试的类,它有两个不同类但相同接口(interface)的实例。这是代码的样子,

要测试的类:

@Service
public class MainClass {
   @Resource(name = "aClass")
   private IClass instance1;
   @Resource(name = "bClass")
   private IClass instance2;
}

其他类:

@Service("aClass")
public class A implements IClass {}

@Service("bClass")
public class B implements IClass {}

我的单元测试:

public MainClassTest {
   @InjectMocks
   private MainClass mainClass;

   @Mock
   private IClass instance1;
   @Mock
   private IClass instance2;

   @Test
   public void test() {...}
}

当我运行测试时,instance1 和 instance2 都为空,因为它们没有被模拟。当接口(interface)只有一个实现时,不会发生这种情况。

知道如何处理这个吗?

谢谢, 安杰洛

最佳答案

@InjectMocks 是一个快捷方式,它告诉 Mockito 实例化您的 MainClass 并尝试通过构造函数注入(inject)或 setter 注入(inject)或属性注入(inject)之一注入(inject)模拟(顺序, IIRC).

我认为您看到的行为可能是 Mockito 的已知行为;有一个open issue describe here与 Mockito 对 @InjectMocks 的处理有关,具有相同模拟类型的两个实例。

因此,您可以使用“老式”方式创建 MainClass 的实例,而不是依赖它,例如在 @Before 方法中。例如:

private MainClass mainClass;

@Before
public void setup() {
    IClass instance1 = mock(IClass.class); 
    IClass instance2 = mock(IClass.class);

    mainClass = new MainClass(instance1, instance2);
}

关于java - 如何模拟具有两种不同实现的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46283400/

相关文章:

python - 如何为 Django 测试自动创建 postgis 数据库?

java - 递归算法的java实现

java - 为什么一个接口(interface)不能实现另一个接口(interface)?

java - 使用二分查找算法作为基础来实现二分插入

java - Spring中Hibernate sessionFactory的配置

Spring MVC架构

php - 需要一些关于 Laravel 4 应用程序测试策略的指导

java - Interleave - 在 Java 中不能正常工作

java - spring data couchbase保存实体不返回id

unit-testing - 使用 Liferay 进行测试驱动开发