当前位置: 首页 > 知识库问答 >
问题:

使用Mockito在Spring Boot测试中模拟MapperFacade返回

沈长恨
2023-03-14

我还没有看到这个问题的答案能解决我的问题。

我有一个服务类,它是用一个存储库和一个Orika MapperFacade构建的。在测试中,我正在安排存储库调用返回的实体列表。my doReturn(testList).when(testRepository).findAllBy...似乎正在工作。我的实际结果列表包含我在模拟列表中指定的相同数量的元素(.size()),但是这些值都是空的。我对Spring Boot相当陌生,对Mockito来说绝对是新手。我目前正在使用一个bean,它返回使用MapperFactory创建的MapperFacade,并定义了几个类映射。现在,我正在测试中为我的MapperFacade使用@Spy,并且可以严格基于断言列表大小相同的内容通过。我知道可能是我需要@Mock行为或MapperFacade,尽管它被用来迭代服务类中的列表。如何在测试中实现它不是积极的。我可以构建另一个DTO列表,该列表通常从循环迭代实体返回,但我对Mockito语法不熟悉,不确定如何运行该返回。

当尝试记录或断言列表元素的. getAnyValue时,我得到一个NullPointerException,但是当我在排列的列表中添加或删除元素时,列表的大小发生了变化。

任何信息赞赏。

服务等级

public class FightService {
    private FightRepository repository;
    private MapperFacade mapper;

    @Autowired
    public FightService(FightRepository r, MapperFacade m) {
        this.repository = r;
        this.mapper = m;


    }

    public List<FightDTO> getFightsByWinRound(int winRound){

        List<FightEntity> entities = repository.findAllByWinRound(winRound);
        List<FightDTO> returnVal = new ArrayList<>();
        for(FightEntity e: entities){
            FightDTO dto = mapper.map(e, FightDTO.class);
            returnVal.add(dto);
        }
        return returnVal;
    }
}

服务测试

@Slf4j
@RunWith(MockitoJUnitRunner.class)
public class FightServiceTest{

    @Spy
    private MapperFacade mapperFacade;

    @Mock
    private FightRepository testRepository;

    @InjectMocks
    private FightService systemUnderTest;




    @Test
    public void testGetFightsByWinRound_ScenarioA() throws Exception{
        //Arrange

        List<FightEntity> testList = new ArrayList<>();
        FightEntity fightA = new FightEntity();
        fightA.setFighter1("A");
        fightA.setWinRound(15);
        testList.add(fightA);
        FightEntity fightB = new FightEntity();
        fightB.setFighter1("B");
        fightB.setWinRound(15);
        testList.add(fightB);
        FightEntity fightC = new FightEntity();
        fightC.setFighter1("C");
        fightC.setWinRound(15);
        testList.add(fightC);

        doReturn(testList).when(testRepository).findAllByWinRound(15);

        

        //Act

        List<FightDTO> actual = systemUnderTest.getFightsByWinRound(15);


        //Assert

        Assert.assertThat(actual.size(), is(3));
        // I would be adding Assert.assertThat(actual.get(0).getFighter1(), is("A")) , but this is where the NPE arises.
    


        //Verify
    }
}

共有1个答案

王声
2023-03-14

这适用于

@InjectMocks
private ServiceClass serviceClass;

@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
    factory = new DefaultMapperFactory.Builder().build();
    when(mapper.getMapperFacade()).thenReturn(factory.getMapperFacade());
    // In case of custom mapping
    factory.classMap(Source.class, Dest.class).customize(new CustomMapper())
            .byDefault().register();
}

您可以在以下位置查看一些内部测试:https://github.com/elaatifi/orika/blob/master/tests/src/main/java/ma/glasnost/orika/test/converter/NumericConvertersTestCase.java#L113

 类似资料:
  • 为了获得可重用和可测试的rxjava代码,我使用ObservableTransformers分离了代码的各个部分。它在生产中工作得很好,但是测试它并不像预期的那么容易,因为我似乎无法模拟那些观察到的ransformers。 when(observableTransformer.apply(any())).thenreturn(observable.just(“mockedtext”)); 一旦调用

  • 我正在尝试构建一个使用gradle作为构建工具和openjdk-11的原型。这个原型将在springboot框架上构建一个rest-api。 我的模块与rest api调用配合良好,并返回了预期结果。然而,当我现在试图为RESTAPI编写测试时,测试失败了,因为Mockito返回了空对象。如果您能了解我应该如何为这个rest api编写测试或如何修复它,我将不胜感激。 我的控制器: 服务: 模型:

  • 我正在尝试对服务类进行单元测试,但模拟返回null 在上面的代码中,当调用到达服务类时为空。我不知道我是否错过了什么。我尝试使用和运行,但结果相同。感谢任何帮助。 提前谢谢你。

  • 让我向您展示getCurrentWeatherWithForecastUsecase类actgually是什么样子: } //这很容易,它只需要一个天气存储库,并要求它获取结果。我把它发送回调用者,调用者将显示它。 更新: 以下是故障的整个堆栈跟踪:

  • 我有以下几门课 我想为viewModel和UseCase编写一个ermetic测试: 但ViewModel.car似乎总是为空。在测试体中mockapi.fetchcar()检索提供的值,但在FetchCarUseCase中不检索。此外,如果我从界面中移除suspend关键字,那么嘲弄似乎可以很好地工作。 目前,由于一些其他条件,我无法使用Mockk库,所以我只能使用mockito。 我是不是漏掉