- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经使用 Mapstruct 编写了类型映射器,以在实体和 DTO 之间映射时完成一些常见任务,例如重命名属性、通过将它们从嵌套结构移出到根级别来“挑选”它们等。初始 PoC实现如下:
@Mapper(
componentModel = "spring",
injectionStrategy = InjectionStrategy.CONSTRUCTOR,
uses = {DocumentationMapper.class},
imports = {Kind.class})
public interface ConnectorMapper {
@Mapping(source = "metadata.extendedProperties", target = "metadata.additionalProperties")
@Mapping(source = "metadata.documentation", target = "documentation")
@Mapping(source = "metadata.name", target = "name")
@Mapping(source = "spec", target = "connectorSpecYaml")
ConnectorDto fromEntity(final ConnectorYaml connectorYaml);
@InheritInverseConfiguration
@Mapping(target = "kind", expression = "java(Kind.Connector)")
ConnectorYaml fromDto(final ConnectorDto connectorDto);
}
这个映射器基本上执行以下操作:
metadata.extendedProperties
重命名为 metadata.additionalProperties
,反之亦然。metadata.documentation
属性,并应用 DocumentationMapper
中定义的映射规则(通过 uses
子句)以及反之亦然。metadata.name
属性,反之亦然。spec
属性重命名为 connectorSpecYaml
,反之亦然。为了对这种行为进行单元测试,我不得不编写一些几乎无法阅读的疯狂断言:
@Test
public void connectorMapperFromEntity() {
// GIVEN a connector entity with fixed values
final var connector = FixtureBuilder.createConnectorYaml("connector");
// WHEN mapping the entity to a DTO
final var connectorDto = connectorMapper.fromEntity(connector);
// THEN the mapping yields a result
assertThat(connectorDto).isNotNull();
// AND the name has been cherry-picked from metadata into the target
assertThat(connectorDto.getName()).isEqualTo(connector.getMetadata().getName());
// AND the metadata has been mapped correctly
assertThat(connectorDto.getMetadata())
.isEqualToIgnoringGivenFields(connector.getMetadata(), "additionalProperties");
// AND the extended properties in metadata have been renamed correctly
assertThat(connectorDto.getMetadata().getAdditionalProperties())
.isEqualTo(connector.getMetadata().getExtendedProperties());
// AND the documentation has been cherry-picked into the target
assertThat(connectorDto.getDocumentation())
.isEqualToIgnoringGivenFields(
connector.getMetadata().getDocumentation(), "additionalProperties");
// AND the extended properties in documentation have been renamed correctly
assertThat(connectorDto.getDocumentation().getAdditionalProperties())
.isEqualTo(connector.getMetadata().getDocumentation().getExtendedProperties());
// AND the spec has been mapped correctly
assertThat(connectorDto.getConnectorSpecYaml()).isEqualTo(connector.getSpec());
}
由于从 fixture 数据手动构建 DTO,另一个方向同样难以阅读:
@Test
public void connectorMapperFromDto() {
final var fixture = FixtureBuilder.createConnectorYaml("connector");
final var connectorDto =
ConnectorDto.builder()
.connectorSpecYaml(fixture.getSpec())
.metadata(
MetadataDto.builder()
.additionalProperties(fixture.getMetadata().getExtendedProperties())
.labels(fixture.getMetadata().getLabels())
.build())
.documentation(
DocumentationDto.builder()
.additionalProperties(
fixture.getMetadata().getDocumentation().getExtendedProperties())
.exampleUsage(fixture.getMetadata().getDocumentation().getExampleUsage())
.longDescription(fixture.getMetadata().getDocumentation().getLongDescription())
.shortDescription(
fixture.getMetadata().getDocumentation().getShortDescription())
.exampleResponse(fixture.getMetadata().getDocumentation().getExampleResponse())
.build())
.name(fixture.getMetadata().getName())
.build();
final var connector = connectorMapper.fromDto(connectorDto);
assertThat(connector).isNotNull();
assertThat(connector).isEqualTo(fixture);
}
此时我很好奇是否有其他方法可以简化测试不执行简单重命名操作的映射器。我正在考虑某种方法来对 JSON 中的输入和预期输出对象进行硬编码,而不是手动构建和比较它们。这是一种可行的方法还是有更合适的方法?
最佳答案
您可以做的就是用随机测试数据填充您的 DTO。检查here这个怎么做。
然后你可以编写一个像这样的测试用例(它有点伪代码,但希望它传达了我的想法):
@Test
public void testNonNullCases() {
ConnectorDto controlDto = generateTestData( ConnectorDto.class );
// map hence-and-forth
ConnectorYaml resultEntity = connectorMapper.fromDto( controlDto );
ConnectorDto resultDto = connectorMapper.fromEntity( resultEntity );
// use assertj to verify them (nested and all)
assertThat( resultDto )
.usingRecursiveComparison()
.ignoringFields( /* fields that you want to do by hand to cover exceptions */
.isEqualTo( controlDto );
// do remaining assertions.
}
@Test
public void testNullCases() {
// I would add a testcase were you leave out attributes (null) and some nested classes in your graph.. just to see whether null cases are handled correctly. You might use jacoco (or other coverage) on the generated code to drive this test
}
public static T generateTestData(Class<T> clz) {
// get inspiration from https://github.com/Blastman/DtoTester/pull/1
}
}
关于java - 简化和改进数据类型映射器的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60329350/
hello1 hello2 hello3 hello4 hello5 hello6
有没有更简短的写法: (apply f (cons a (cons b (cons c d)))) ? 谢谢! (我正在编写一些调用其他函数的辅助函数,这种“模式”似乎经常出现
.NET团队北京时间2024年5月22日已正式发布.NET Aspire ,在博客文章里做了详细的介绍:.NET Aspire 正式发布:简化 .NET 云原生开发 - .NET 博客 (micros
在this dbfiddle demo我有一个 DELETE FROM...WHERE 最后像这样: ...... DELETE FROM data_table WHERE
我有几个 if 语句,如下面的一个。我假设这是一种非常糟糕/长期的编码方式,但不确定我应该做些什么不同的事情。有人有什么建议吗? 谢谢 For a = 1 To Leagues If a =
有什么类似的战术simpl为 Program Fixpoint ? 特别是,如何证明以下无关紧要的陈述? Program Fixpoint bla (n:nat) {measure n} := mat
我使用此代码来跟踪表单上是否有任何更改: $(document).on('input', '.track', function() { var form = $(this); }); 由于这不
我有以下函数,我想用 for 循环来简化它,但不知道该怎么做。任何帮助都感激不尽。基本上,如果字段值为 0 或 null,则我的总值(字段)应为 0,否则,如果字段值从 1 到 1000,则总值变为
我正在尝试对时间字符串执行非常简单的解析 data Time = Time Int Int Int String -- example input: 07:00:00AM timeParser ::
为了使我的代码更具可读性和更简单,我对这段代码绞尽脑汁: var refresh = setInterval(datumTijd, 1000); function datumTijd() { do
这个问题已经有答案了: Check if a variable is in an ad-hoc list of values (8 个回答) 已关闭 9 年前。 只是一个基本的if声明,试图使其更简单
我有一个这样的 if 语句 int val = 1; if (val == 0 || val == 1 || val == 2 || ...); 有没有更简单的方法?例如: int val = 1;
我有一个程序,其中有一些 if 语句,与我将要向您展示的程序类似。我想知道你们是否可以帮助我以任何方式简化这个方程。我之所以问这个问题,是因为在我的 Notepad++ 中,它持续了 443 列,如果
是否可以简化这个 if 语句? 如果是,答案是什么? if (type) { if(NdotL >= 0.0) { color
我有一个包含亚马逊大河的 shapefile。仅 shapefile 就有 37.9 MB,连同属性表高达 42.1 MB。我正在生成所有巴西亚马逊的 PNG 图像,每个 1260x940 像素,sh
System.out.printf("%7s", "a"); System.out.printf("%7s", "b"); System.out.printf("%7s", "c"); S
假设我们有客户端-服务器应用程序,由一个 makefile 编译。服务器使用 libtask 为并行客户端提供服务。客户端使用 ncurses 来处理某些图形。目录树如下所示: ./ --bin/ -
我在 Mono 密码转换的重新实现中找到了这段代码。 我没有修改或简化任何东西 - 这就是它的实际运行方式(有评论如//Dispose unmanaged objects,但实际上什么也没做)。 现在
我需要一些帮助来简化这个包含数百行的庞大代码,但我真的不知道该怎么做。代码看起来真的很乱,我需要的是返回具有预定义文本颜色的模型。有什么简单的方法吗? 我必须多解释一点:- 有一个包含许多型号的手机列
这里有一些代码可以正常工作,但我认为可以简化/缩短。它基本上是点击一个列表项,获取它的 ID,然后根据 ID 显示/隐藏/删除元素。 关于如何使用函数或循环来简化它的建议? $("#btn_remov
我是一名优秀的程序员,十分优秀!