首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Mockito:将真实对象注入到private @Autowired字段中

Mockito:将真实对象注入到private @Autowired字段中
EN

Stack Overflow用户
提问于 2013-11-28 23:59:08
回答 5查看 139.5K关注 0票数 235

我正在使用Mockito的@Mock@InjectMocks注解将依赖项注入到用Spring的@Autowired注解的私有字段中

代码语言:javascript
复制
@RunWith(MockitoJUnitRunner.class)
public class DemoTest {
    @Mock
    private SomeService service;

    @InjectMocks
    private Demo demo;

    /* ... */
}

代码语言:javascript
复制
public class Demo {

    @Autowired
    private SomeService service;

    /* ... */
}

现在,我还想将真正的对象注入私有@Autowired字段(没有设置器)。这是可能的,还是该机制仅限于注入Mock?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-11-29 00:22:18

使用@Spy注释

代码语言:javascript
复制
@RunWith(MockitoJUnitRunner.class)
public class DemoTest {
    @Spy
    private SomeService service = new RealServiceImpl();

    @InjectMocks
    private Demo demo;

    /* ... */
}

Mockito将考虑所有具有@Mock@Spy注释的字段作为潜在的候选字段,以将其注入到带有@InjectMocks注释的实例中。在上面的例子中,'RealServiceImpl'实例将被注入到“演示”中。

有关详细信息,请参阅

Mockito-home

@Spy

@Mock

票数 387
EN

Stack Overflow用户

发布于 2016-08-15 15:07:10

除了@Dev空白答案之外,如果您想使用Spring创建的现有bean,则可以将代码修改为:

代码语言:javascript
复制
@RunWith(MockitoJUnitRunner.class)
public class DemoTest {

    @Inject
    private ApplicationContext ctx;

    @Spy
    private SomeService service;

    @InjectMocks
    private Demo demo;

    @Before
    public void setUp(){
        service = ctx.getBean(SomeService.class);
    }

    /* ... */
}

这样,您不需要更改代码(添加另一个构造函数)就可以使测试正常工作。

票数 21
EN

Stack Overflow用户

发布于 2019-08-12 22:20:27

Mockito不是DI框架,甚至DI框架也鼓励构造函数注入而不是字段注入。

因此,您只需声明一个构造函数来设置被测类的依赖关系:

代码语言:javascript
复制
@Mock
private SomeService serviceMock;

private Demo demo;

/* ... */
@BeforeEach
public void beforeEach(){
   demo = new Demo(serviceMock);
}

在一般情况下使用Mockito spy是一个糟糕的建议。这使得测试类变得脆弱、不整洁、容易出错:什么才是真正被嘲笑的?真正测试的是什么?

@InjectMocks@Spy也损害了整体设计,因为它鼓励臃肿的类和类中的混合责任。

请在盲目使用之前使用read the spy() javadoc (不是我的重点):

创建了一个真实对象的间谍。间谍调用真正的方法,除非它们被存根。真正的间谍应该小心使用,偶尔使用,例如在处理遗留代码时。

像往常一样,您将阅读partial mock warning:面向对象编程通过将复杂性划分为单独的、特定的SRPy对象来处理复杂性。partial mock如何适应这种范式?它就是不..。部分模拟通常意味着复杂性已移动到同一对象上的不同方法。在大多数情况下,这不是您想要的设计应用程序的方式。

然而,在极少数情况下,部分mock会派上用场:处理你不能轻易更改的代码(第三方接口,遗留代码的临时重构等)。但是,对于新的、测试驱动的和设计良好的代码,我不会使用部分模拟。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20270391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档