Код: Выделить всё
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingConstants;
import org.mapstruct.NullValueCheckStrategy;
import java.math.BigDecimal;
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING,
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public interface MyEntityMapper {
@Mapping(source = "source1", target = "target1")
@Mapping(source = "source2", target = "target2")
MyEntity toMyEntity(MyInput input);
}
< /code>
А затем я добавляю тест Springboot, чтобы проверить отображение, как и ожидалось, < /p>
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import java.math.BigDecimal;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest(classes = MyEntityMapper.class)
class MyEntityMapperTest {
@Autowired
private MyEntityMapper underTest;
@Test
@DisplayName("Entity mapped when input provided")
void test_toMyEntity_returnsMappedEntity_whenInputProvided() {
MyEntity result = underTest.toMyEntity(MyInputRepository.basicInput());
assertThat(result).isNotNull();
// more asserts if needed
}
}
< /code>
Но когда я запускаю этот тест, я получаю следующую ошибку: < /p>
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.example.mapper.MyEntityMapperTest': Unsatisfied dependency expressed through field 'underTest'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.mapper.MyEntityMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at ...
< /code>
Проверка журналов подробно и проведено в веб -исследованиях, я обнаружил, что это может быть проблемой инициализации контекста. Кажется, что Springboot использует некоторых слушателей, чтобы подготовить некоторые бобы. Когда начинается пружина, я нахожу следующее сообщение: < /p>
{
"logger_name": "com.example.mapper.MyEntityMapperTest",
"message": "Started MyEntityMapperTest in 0.849 seconds (JVM running for 2.076)",
"log_level": "INFO",
"log_type": "DEFAULT",
"thread_name": "main",
"stack_trace": "-"
}
============================
CONDITIONS EVALUATION REPORT
============================
Positive matches:
-----------------
None
Negative matches:
-----------------
None
Exclusions:
-----------
None
Unconditional classes:
----------------------
None
{
"logger_name": "org.springframework.test.context.TestContextManager",
"message": "Caught exception while allowing TestExecutionListener [org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener@1852a3ff] to prepare test instance [com.example.mapper.MyEntityMapperTest@3ce53f6a]",
"log_level": "ERROR",
"log_type": "DEFAULT",
"thread_name": "main",
"stack_trace": "o.s.b.f.NoSuchBeanDefinitionException: ..."
}
обходной путь
Я нашел способ оборудования, просто загрузив полный контекст пружины. Похоже, что в таких обстоятельствах пружина правильно запускает все начатели и правильно загружает мою фасоль Mapper. Тем не менее, это подразумевает много времени, чтобы запустить простой тест и необходимость добавления невидимой конфигурации теста, например: < /p>
Код: Выделить всё
@SpringBootTest
@ActiveProfiles("test")
class MyEntityMapperTest {...}
Подробнее здесь: https://stackoverflow.com/questions/797 ... apper-bean