如何在Junit中使用@InjectMocks和@Autowired注释

我有一个A类,它使用3个不同的类和自动assembly

public class A () { @Autowired private B b; @Autowired private C c; @Autowired private D d; } 

在测试它们时,我希望只有2个类(B&C)作为模拟,并且将D类自动assembly为正常运行,此代码对我不起作用:

 @RunWith(MockitoJUnitRunner.class) public class aTest () { @InjectMocks private A a; @Mock private B b; @Mock private C c; @Autowired private D d; } 

甚至可以这样做吗?

应该是这样的

 @RunWith(SpringJUnit4ClassRunner.class) public class aTest () { @Mock private B b; @Mock private C c; @Autowired @InjectMocks private A a; } 

如果你想让D成为Autowired ,则不需要在Test类中做任何事情。 您的自动Autowired A应具有正确的D实例。 此外,我认为您需要使用SpringJUnit4ClassRunner进行Autowiring ,并正确设置contextConfiguration 。 因为您没有使用MockitoJunitRunner您需要自己初始化您的MockitoJunitRunner

MockitoAnnotations.initMocks(java.lang.Object testClass)

我遇到了同样的问题,并尝试了Sajan Chandran的回答。 它在我的情况下不起作用,因为我使用@SpringBootTest注释只加载我所有bean的子集。 目标不是加载我正在嘲笑的bean,因为它们有很多其他依赖项和配置。

我发现以下解决方案的变体对我有用,在正常情况下也可以使用。

 @RunWith(SpringRunner.class) @SpringBootTest(classes={...classesRequired...}) public class aTest () { @Mock private B b; @Mock private C c; @Autowired @Spy private D d; @InjectMocks private A a; @Before public void init(){ MockitoAnnotations.initMocks(this); } }