Mockito:将真实对象注入私有@Autowired领域

2022-08-31 05:34:12

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

@RunWith(MockitoJUnitRunner.class)
public class DemoTest {
    @Mock
    private SomeService service;

    @InjectMocks
    private Demo demo;

    /* ... */
}

public class Demo {

    @Autowired
    private SomeService service;

    /* ... */
}

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


答案 1

使用批注@Spy

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

    @InjectMocks
    private Demo demo;

    /* ... */
}

Mockito 会将所有具有注释或注释的字段视为要注入到带有注释的实例中的潜在候选项。在上面的情况下,实例将被注入到“演示”中@Mock@Spy@InjectMocks'RealServiceImpl'

有关更多详细信息,请参阅

莫基托之家

@Spy

@Mock


答案 2

除了@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);
    }

    /* ... */
}

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


推荐