Mockito:如何正确模拟 Spring 服务列表

Mockito: How to properly mock a List of Spring Services

我正在尝试使用 Mockito 测试以下 Spring 服务 class:

@Service
public class ObjectExportService {

    @Autowired
    protected List<SecuredService<? extends SecuredObject>> securedServices;

    public void doStuff() {
        for(int i = 0; i < this.securedServices.size(); i++){
            SecuredService<? extends SecuredObject> securedSrv = this.securedServices.get(i);
            //this access works
        }
        for (SecuredService<? extends SecuredObject> securedSrv : this.securedServices) { //this access does not work
            
        }
    }
}

这是我对该服务的测试class:

@RunWith(MockitoJUnitRunner.class)
public class ObjectExportServiceTest {

    @InjectMocks
    private ObjectExportService objectExportService;

    @Mock
    protected List<SecuredService<? extends SecuredObject>> securedServices;

    @Test
    public void testDoStuff(){
        objectExportService.doStuff();
        Assert.assertTrue(true);
    }
}

当我 运行 测试时,我得到一个 NullpointerException,但只在 for-each 循环中。

首先我假设是一个与 this 线程中描述的类似的问题: 我已经模拟了列表,因此需要模拟 iterator() 调用。

该线程中提供的解决方案对我不起作用,因为我实际上是在自动装配一个列表。

所以我在另一个线程中偶然发现了 解决方案。只需将 @Mock 更改为 @Spy 即可解决我的问题:

@RunWith(MockitoJUnitRunner.class)
public class ObjectExportServiceTest {

    @InjectMocks
    private ObjectExportService objectExportService;

    @Spy  // <-- change here
    protected List<SecuredService<? extends SecuredObject>> securedServices;

    @Test
    public void testDoStuff(){
        objectExportService.doStuff();
        Assert.assertTrue(true);
    }
}