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

2022-08-31 15:42:54

我有一个A类,它使用3个不同的类与自动布线

public class A () {

    @Autowired
    private B b;

    @Autowired
    private C c;

    @Autowired
    private D d;
}

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

@RunWith(MockitoJUnitRunner.class)
public class aTest () {

    @InjectMocks
    private A a;

    @Mock
    private B b;

    @Mock
    private C c;

    @Autowired
    private D d;
}

甚至有可能这样做吗?


答案 1

它应该是这样的

@RunWith(SpringJUnit4ClassRunner.class)
public class aTest () {

    @Mock
    private B b;

    @Mock
    private C c;

    @Autowired
    @InjectMocks
    private A a;

}

如果你想成为,不需要在你的课堂上做任何事情。您应该具有 正确的实例。另外,我认为你需要使用 for 来工作,正确设置。因为你没有使用,所以你需要初始化你自己使用DAutowiredTestAutowiredADSpringJUnit4ClassRunnerAutowiringcontextConfigurationMockitoJunitRunnermocks

MockitoAnnotations.initMocks(java.lang.Object testClass)


答案 2

我遇到了同样的问题,并尝试了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);
    }

}

推荐