Mockito:将真实对象注入私人@Autowired字段?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

我正在使用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领域(没有setter)。这是可能的还是仅限于注入Mocks的机制?

提问于
用户回答回答于

使用@Spy注释

@RunWith(MockitoJUnitRunner.class)
public class DemoTest {
    @Spy
    private SomeService service = new RealServiceImpl();

    @InjectMocks
    private Demo demo;

    /* ... */
}

Mockito会将@Mock或@Spy注释的所有字段视为注入@InjectMocks注释注释的实例中的潜在候选对象。在上面的例子中,'RealServiceImpl'实例将被注入'demo'

用户回答回答于

如果你想使用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);
    }

    /* ... */
}

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

扫码关注云+社区