我正在使用MapStruct,mapstruct-jdk8版本1.1.0.final并定义我通过spring注入的抽象类。
我正在研究如何能够通过Junit测试来测试它们?我有一个基本的主映射器,它将使用2个子映射器
@Mapper(componentModel = "spring", uses = {SubMapper1.class, SubMapper2.class})
public abstract class MainMapper {
@Mapping(target = "field1", qualifiedByName = {"MyMapper2Name", "toEntity"})
public abstract MyEntity toEntity(MyDto pDto);
public MyDto fromEntity(MyEntity pEntity) {
// Specific code, hence why I use Abstract class instead of interface.
}
}
我尝试了几种方法,但无法正确实例化映射器来测试它。
@RunWith(SpringRunner.class)
public class MainMapperTest {
private MainMapper service = Mappers.getMapper(MainMapper.class);
@Test
public void testToEntity() throws Exception {
.....
java.lang.RuntimeException:java.lang.ClassNotFoundException:找不到Com.Mappers.MainMapper的实现
我也试过通过@injectmock,但也没有骰子。
无法实例化名为“service”的@InjectMocks字段。您没有在字段声明中提供实例,所以我尝试构造实例。但是,我失败了,因为:类型'MainMapper是一个抽象类。
通过spring@AutoWired
原因:org.springframework.beans.factory.noSuchBeanDefinitionException:没有“com.mappers.mainmapper”类型的合格bean可用:应至少有一个合格的自动候选bean。依赖项注释:{@org.SpringFramework.Beans.Factory.Annotation.AutoWired(required=true)}
我猜这可能与注释处理器和映射器没有在我启动测试时生成有关。我找到了这个类作为示例。
然而,类注释ProcessorTestRunner似乎在1.2之前还不能使用,它还没有最终版本。
所以我的问题是我如何编写Junit测试来测试我的mapstruct抽象类映射器,我在代码中通过spring注入使用它。
您有多个问题:
映射器#getMapper(Class)
与默认的ComponentModel
一起使用,否则将无法正确实例化映射器。如果您在那里获得runtimeexception
,则表示未生成实现类。确保有正确的设置MainMapperImpl
而不是针对抽象类进行测试。componentscan
并确保实现和使用的映射器可以自动连线。您链接的类是一个错误的测试类,并且与您的测试用例不相关。看一下这个用于spring集成的集成测试用例。
AnnotationProcessorTestRunner
是我们测试的一部分,用于测试注释处理器,并且从一开始就存在。它不是发行版的一部分。
针对@Richard Lewan的评论,下面是我如何使用2个子映射器为抽象类ConfigurationMapper声明测试类的
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {ConfigurationMapperImpl.class, SubMapper1Impl.class, SubMapper2Impl.class})
public class ConfigurationMapperTest {
您在SpringBootTest
注释中使用IMPL
生成的类,然后注入要测试的类:
@Autowired
private ConfigurationMapper configurationMapper;
如果你需要更多的信息,让我知道,但从那里它是直接的。我没有模拟子映射器,因为我最好一次测试所有的映射过程。
我试图用为MapStruct映射器编写单元测试。 单元测试类: 任何帮助都将不胜感激。
我有下面的映射器类,我想在其中使用。我正在尝试构造函数注入,但不起作用,并且正在打印。 mapStruct实现类 如果我使用使用字段注入,这样它就可以正常工作。这意味着Spring不支持类的构造函数注入。是因为类不能直接实例化,需要子类来实例化吗? 有没有什么方法可以在实现类中创建一个构造函数,如下所示: 这样,构造函数注入应该可以工作。
我在为SpringJUnit4ClassRunner.class)配置测试时遇到了问题。我的问题是因为我的映射器从map结构到达时返回null。
当前有包含内部映射器的映射器(有时,它们本身包含其他内部映射器)。
我使用的是一个用MapStruct生成的映射器: 缺省组件模型是spring(在pom.xml中设置)
基本上,我只是想测试我的映射器,它应该是由MapStruct自动生成的。 我尝试了所有可能的注释,这个答案似乎是使用sprinboot和JUnit5的最佳解决方案,尽管它在我的eclipse中仍然不起作用,不知为什么它只是显示了一个如下所示的错误,即尽管它应该通过@mapper注释自动生成。例如,我也在使用Lombok注释和所有这些自动生成的方法,eclipse都能识别并工作得非常好。 那我做错了