java - 使用 Spring 创建 MapStruct bean 时出错
问题描述
在这里尝试使用 MapStruct 进行一些测试。我有以下课程:
测试班
RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class MapperTests {
@Autowired
private UsuarioMapper usuarioMapper; //Can't autowire(No typo found)
@Test
public void dadoUsuarioSalvarDTO_quandoMapeioParaUsuario_entaoRetornaUsuario(){
//Dado
UsuarioSalvarDTO usuarioSalvarDTO = new UsuarioSalvarDTO();
usuarioSalvarDTO.setEmail("test@test.com");
usuarioSalvarDTO.setSenha("123456789");
usuarioSalvarDTO.setStatus(TipoStatus.ATIVO);
Usuario usuario = usuarioMapper.toEntity(usuarioSalvarDTO);
Assert.assertEquals(usuario.getEmail(), "test@test.com");
Assert.assertEquals(usuario.getSenha(), "123456789");
Assert.assertEquals(usuario.getStatus(), TipoStatus.ATIVO);
}
}
映射器
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.WARN)
public interface UsuarioMapper {
@Mappings({
@Mapping(target = "id", ignore = true),
@Mapping(target = "createdAt", ignore = true),
@Mapping(target = "updatetAt", ignore = true),
@Mapping(source="usuarioSalvarDTO.email", target = "email")
})
Usuario toEntity(UsuarioSalvarDTO usuarioSalvarDTO);
}
在这里考虑模型
生成的 UsuarioMapperImpl:
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2018-11-24T00:40:25-0200",
comments = "version: 1.2.0.Final, compiler: javac, environment: Java 1.8.0_181 (Oracle Corporation)"
)
@Component
public class UsuarioMapperImpl implements UsuarioMapper {
@Override
public Usuario toEntity(UsuarioSalvarDTO usuarioSalvarDTO) {
if ( usuarioSalvarDTO == null ) {
return null;
}
Usuario usuario = new Usuario();
usuario.setEmail( usuarioSalvarDTO.getEmail() );
usuario.setSenha( usuarioSalvarDTO.getSenha() );
usuario.setStatus( usuarioSalvarDTO.getStatus() );
return usuario;
}
}
当我尝试运行测试时,他给出了以下错误:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'br.com.financeiroAdam.demo.MapperTests': Unsatisfied dependency expressed through field 'usuarioMapper'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'br.com.financeiroAdam.demo.mapper.UsuarioMapper' available: expected at least 1 bean which qualifies as autowire candidate.
MapperTest 中的@Autowire 不起作用。它声称:'无法自动接线。没有找到“UsuarioMapper”类型的豆子。
已经尝试过:
- gradle build(没有错误)
- gradle build -x test(没有错误)
- 使缓存无效/重新启动
- 重新导入项目
使用:
- 智能
- 摇篮
- 春天
- 龙目岛
构建.gradle
buildscript {
ext {
springBootVersion = '2.1.0.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
plugins {
id 'net.ltgt.apt' version '0.8'
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'br.com.financeiroAdam'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
implementation('org.springframework.boot:spring-boot-starter-data-jpa')
implementation('org.springframework.boot:spring-boot-starter-web')
compileOnly('org.projectlombok:lombok:1.18.2')
compile 'org.mapstruct:mapstruct-jdk8:1.2.0.Final'
testImplementation('org.springframework.boot:spring-boot-starter-test')
apt('org.projectlombok:lombok:1.18.2')
apt('org.mapstruct:mapstruct-processor:1.2.0.Final')
}
什么都试过了。我认为 mapstruct 根本不想工作。有什么解决办法吗?
解决方案
//Use @Mock instead of @Autowired
@Mock
private UsuarioMapper usuarioMapper;
//In test method use the below
Mockito.doReturn(info).when(usuarioMapper).XYXMethod(ArgumentMatchers.argThat(t24InfoMatcher));
推荐阅读
- php - 在PHP中的同一页面上根据需要调用一次或每次函数?
- amazon-mws - 通过 MWS API 丢失/接收不正确的结算报告
- unity3d - 使用动画师运行微调器的平滑连续旋转动画
- css - 如何在 Sass 中将 VW 转换为 px?
- r-markdown - 在 xaringan 中突出显示代码选择
- android - 将 AdColony 与中介集成时无法第二次加载广告
- javascript - 使用 Javascript 在页面加载时禁用 cookie
- javascript - 我应该如何将json响应对象与for循环的变量J连接起来
- python - 将光标位置设置为 TextInput
- dart - 类之外的小部件的“状态”是什么