如何在单元测试中获取装饰后的 Mapstruct 映射器的实例?

问题描述 投票:0回答:1

我想测试 Mapstruct 映射器。如果我将测试集成并用

@SpringBootTest
进行注释,下面的代码就可以工作。但是,我想将其作为单元测试。在这种情况下我如何获得装饰映射器?

@Mapper
        (componentModel = "spring")
@DecoratedWith(CardMapperDecorator.class)
public interface CardMapper {
// and so on
@Component
public abstract class CardMapperDecorator implements CardMapper {

    private CardMapper delegate;

    @Autowired
    public void setDelegate(CardMapper delegate) {
        this.delegate = delegate;
    }
// and so on
// commented out to avoid bootstrapping the Spring context
//@ExtendWith(MockitoExtension.class)
//@SpringBootTest
//@ActiveProfiles("test")
class CardMapperTest {

    private final String CARD_NUMBER = "1111222233334444";
//    @Autowired
    private CardMapper cardMapper;
// ...
    @BeforeEach
    void setUp() {
// this leads to an NPE later since the delegate field is not initialized
        cardMapper = Mappers.getMapper(CardMapper.class);

如果按照文档的建议,我将代码更改为此(添加构造函数):

//@Component
@RequiredArgsConstructor
public abstract class CardMapperDecorator implements CardMapper {

    private final CardMapper delegate;

//    @Autowired
//    public void setDelegate(CardMapper delegate) {
//        this.delegate = delegate;
//    }

我遇到另一个异常:

Caused by: java.lang.NoSuchMethodError: by.afinny.credit.mapper.decorator.CardMapperDecorator: method 'void <init>()' not found
    at by.afinny.credit.mapper.CardMapperImpl.<init>(CardMapperImpl.java:28)
    ... 82 more

为什么我需要一些

void <init>

java unit-testing mapstruct
1个回答
0
投票

尝试使用映射器的

default
组件模型。

更改为这个

@Mapper(component="default")
,看看这是否有效。

© www.soinside.com 2019 - 2024. All rights reserved.