我想测试 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>
?
尝试使用映射器的
default
组件模型。
更改为这个
@Mapper(component="default")
,看看这是否有效。