我正在使用Mockito的@Mock
和@InjectMocks
注解将依赖项注入到用Spring的@Autowired
注解的私有字段中
@RunWith(MockitoJUnitRunner.class)
public class DemoTest {
@Mock
private SomeService service;
@InjectMocks
private Demo demo;
/* ... */
}
和
public class Demo {
@Autowired
private SomeService service;
/* ... */
}
现在,我还想将真正的对象注入私有@Autowired
字段(没有设置器)。这是可能的,还是该机制仅限于注入Mock?
发布于 2013-11-29 00:22:18
使用@Spy
注释
@RunWith(MockitoJUnitRunner.class)
public class DemoTest {
@Spy
private SomeService service = new RealServiceImpl();
@InjectMocks
private Demo demo;
/* ... */
}
Mockito将考虑所有具有@Mock
或@Spy
注释的字段作为潜在的候选字段,以将其注入到带有@InjectMocks
注释的实例中。在上面的例子中,'RealServiceImpl'
实例将被注入到“演示”中。
有关详细信息,请参阅
发布于 2016-08-15 15:07:10
除了@Dev空白答案之外,如果您想使用Spring创建的现有bean,则可以将代码修改为:
@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);
}
/* ... */
}
这样,您不需要更改代码(添加另一个构造函数)就可以使测试正常工作。
发布于 2019-08-12 22:20:27
Mockito不是DI框架,甚至DI框架也鼓励构造函数注入而不是字段注入。
因此,您只需声明一个构造函数来设置被测类的依赖关系:
@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会派上用场:处理你不能轻易更改的代码(第三方接口,遗留代码的临时重构等)。但是,对于新的、测试驱动的和设计良好的代码,我不会使用部分模拟。
https://stackoverflow.com/questions/20270391
复制相似问题