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

调试时未使用自动配置初始化MapSTRt映射器

爱花蜂
2023-03-14

我在mapstruct中使用spring boot 2.3.2。

在服务类中,我有一个映射器,它有一个自动连接的注释。

@Service
public BillingService{

    private BillingRepository billingRepository;


    @Autowired
    private  BillingMapper billingMapper;   


    @Autowired
    public BillingService (BillingRepository billingRepository){
        this.billingRepository=billingRepository;
    }

    public void getBilling(Long billingId){
        ....
        billingMapper.convertTo(...);
    }

}


@RunWith(MockitoJUnitRunner.class)
public class BillingServiceTest{
    @Mock
    BillingRepository billingRepository;

    private BillingService bilingService;

    @Spy
    private BillingMapper billingMapper = Mappers.getMapper(BillingMapper.class);

    @BeforeEach
    public void setup(){
        MockitoAnnotations.initMocks(this);
        billingService = new BillingService();
    }

    @Test
    public void testGetBilling(){

        List<Billing> billings = new ArrayList<>();
        ...

        List<BillingPayload> payloads = new ArrayList<>();

        when(billingMapper.convertTo(billings)).thenReturn(payloads);     

        bilingService.getBilling(1l);  
    }

}

@Mapper(componentModel="spring")
public interface BillingMapper{
    ...
}

当我调试BillingService类中的getBilling方法时,billingMapper总是空的;

共有1个答案

伊锦
2023-03-14

您使用的配置非常奇怪。首先,您有一个返回BillingService的方法,它没有指定任何返回值,所以它甚至不会编译。我建议如下:

@Service
public BillingService{

    private final BillingRepository billingRepository;
    private final BillingMapper billingMapper;

    // constructor with bean injection
    public BillingService(final BillingRepository billingRepository,
                          final BillingMapper billingMapper) {
        this.billingRepository = billingRepository;
        this.billingMapper = billingMapper;
    }

    public void getBilling(Long billingId){
        ....
        billingMapper.convertTo(...);
    }

}

然后,您可以按照以下方式配置测试:

@RunWith(SpringJUnit4ClassRunner.class)
public class BillingServiceTest {

    @Spy private BillingMapper billingMapper = Mappers.getMapper(BillingMapper.class);
    @MockBean private BillingRepository billingRepository;
    @Autowired private BillingService billingService;

    @TestConfiguration
    static class BillingServiceTestContextConfiguration {
        @Bean public BillingService billingService() {
            return new BillingService(billingRepository, billingMapper);
        }
    }

    @Test
    public void testGetBilling(){
        List<Billing> billings = new ArrayList<>();
        ...
        List<BillingPayload> payloads = new ArrayList<>();
        when(billingRepository.findById(1L)).thenReturn(); // someResult
        when(billingMapper.convertTo(billings)).thenReturn(payloads);
        bilingService.getBilling(1l);  
    }
}

@Mapper(componentModel="spring")
public interface BillingMapper{
    ...
}

类似的配置应该可以工作。主要的问题是,您将@Autowired与setter/constructor注入混合在一起(不知道,因为你在BillingService中使用了奇怪的方法。也不知道你在尝试模拟界面时为什么要使用@Spy注释。@Spy用于模拟实际实例,而@Mock是模拟类类型。如果BillingMapper被指定为Bean在应用程序中。

 类似资料:
  • 问题内容: 在一对多JPA关联中,将空关系初始化为空集合是否被视为最佳实践?例如。 在上面的示例中,最好将默认值定义为空吗?优缺点都有什么? 问题答案: JPA本身并不关心集合是否已初始化。当使用JPA从数据库中检索订单时,JPA将 始终 返回带有非空OrderLine列表的Order。 原因:因为一个订单可以有0行,1行或N行,并且最好用一个空的,一个大小或N个大小的集合进行建模。如果集合为空,

  • 我正在尝试实现MapStruct映射库。我制作了一些示例,对于简单的映射,它工作得很好,但我在1期中遇到了问题。我有2个jpa实体类,它们具有双向关系。一个在另一个里,另一个在一个里。它会产生循环映射问题,因此MapStruct会引发StackOverflow错误。我已经创建了最少的代码来在github上重现这个案例。示例代码: 数据生成器 映射器 应用程序 Dto/目标类与原始源类相同。主要是循

  • 问题内容: 我刚刚将xcode更新为6.3.1。问题是自Swift 1.2起我收到了这个奇怪的错误消息。我收到这种错误消息 在此代码上 问题答案: 在调用任何init方法之前,必须初始化所有属性 因此,在调用super.init()之前先进行更改 例外: 可选属性 具有默认值的属性 懒惰的财产

  • sudo cp/etc/kubernetes/admin.conf$home/sudo chown$(id-u):$(id-g)$home/admin.conf导出kubeconfig=$home/admin.conf 设置组织 kubectl apply--文件名https://git.io/weave-kube-1.6 验证主模式是否已就绪,以及dns吊舱是否正在运行。 没有错误的连接节点。