如何模拟具有两种不同实现的接口

Dem*_*ian 5 java junit spring unit-testing mockito

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

要测试的类:

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

其他类:

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

@Service("bClass")
public class B implements IClass {}
Run Code Online (Sandbox Code Playgroud)

我的单元测试:

public MainClassTest {
   @InjectMocks
   private MainClass mainClass;

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

   @Test
   public void test() {...}
}
Run Code Online (Sandbox Code Playgroud)

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

知道如何处理吗?

谢谢,安吉洛

gly*_*ing 5

@InjectMocks是一条捷径,它告诉 Mockito 实例化您MainClass并尝试通过构造函数注入或 setter 注入或属性注入(按顺序,IIRC)之一注入模拟。

我认为您所看到的行为可能是 Mockito 的已知行为;这里有一个未解决的问题描述了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);
}
Run Code Online (Sandbox Code Playgroud)