当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在Junit中使用@InjectMocks和@Autowired注释》经验,为你挑选了2个好方法。

我有一个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> Sajan Chandr..:

应该是这样的

@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.此外,我认为你需要使用SpringJUnit4ClassRunnerAutowiring工作,用contextConfiguration正确的设定.因为你没有使用MockitoJunitRunner你需要初始化mocks自己使用

MockitoAnnotations.initMocks(java.lang.Object testClass)


重要的是要注意,对象将由自动装配创建,并且模拟器将由注册器注入.这从来没有发生在我身上,因为我的对象只有一个构造函数,并且没有这些字段的setter,所以模拟的实例没有被注入(并且没有报告它没有注入模拟).这打破了我希望的模型(不可变对象),因此,像其他人一样,我相信InjectMocks可能是一个坏主意.
有一种情况,这种方法不起作用:当`A`用`@Transactional`注释时(或者用@@ Transactional`注释的方法); 请参阅http://stackoverflow.com/questions/12857981/transactional-annotation-avoids-services-being-mocked和http://stackoverflow.com/questions/21124326/how-to-inject-mock-into-service-that都具有一个事务

2> Thomas..:

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

}

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有