mockito:如何正确地模拟spring服务列表

azpvetkf  于 2021-07-15  发布在  Java
关注(0)|答案(1)|浏览(286)

我尝试用mockito测试以下spring服务类:

@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

        }
    }
}

这是我针对该服务的测试类:

@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循环中。
首先,我假设有一个与此线程中描述的类似的问题:我已经模拟了列表,因此需要模拟 iterator() 打电话。
该线程中提供的解决方案对我不起作用,因为我实际上是在自动生成一个列表。

mkshixfv

mkshixfv1#

所以我在另一个线程中偶然发现了这个解决方案。只需改变 @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);
    }
}

相关问题