Mockito:将真实对象注入私有的@Autowired字段

问题

我正在使用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;

    /* ... */
}

现在我想将真正的对象注入private@Autowiredfields(没有setter)。这是可能的还是机制仅限于注射Mocks?


#1 热门回答(203 赞)

Use@Spyannotation

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

    @InjectMocks
    private Demo demo;

    /* ... */
}

Mockito将考虑所有具有@Mock@Spy注释的字段作为注入带有@InjectMocks注释的实例的潜在候选者。在上面的案例中,'RealServiceImpl'实例将被注入'demo'

有关详细信息,请参阅
Mockito-home@Spy@Mock


#2 热门回答(17 赞)

除了@Dev Blanked的答案,如果你想使用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);
    }

    /* ... */
}

这样你就不需要更改代码(添加另一个构造函数)来使测试工作。