当前位置: 首页 > 知识库问答 >
问题:

AssertJ:为集生成流畅的断言

邢璞
2023-03-14

公共的hasItems(interface iteminterface...items)

这当然不能编译。

导致该问题的示例代码如下:


    public interface EntityInterface {

      Set<? extends ItemInterface> getItems();
    }

    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    @With
    public class EntityA implements EntityInterface {

      private Set<ItemA> items;
    }

    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    @With
    public class EntityA implements EntityInterface {

      private Set<ItemA> items;
    }

    public interface ItemInterface {

      String getName();
    }

    public class ItemA implements ItemInterface {

      public String getName() {
        return "ItemA";
      }
    }

    public class ItemA implements ItemInterface {

      public String getName() {
        return "ItemA";
      }
    }

    null

公共的hasItems(t..items)

但是T在上下文中是不知道的。

公共接口entityinterface

这并没有什么不同。

有没有我错过的解决方案?

共有1个答案

欧阳正谊
2023-03-14

正如您所观察到的,问题在于AssertJ使用无效方法创建AbstractEntityInterfaceAssert类,如:

public S hasItems(interface ItemInterface... items) {/*...*/}

我没有使用AssertJ的实际经验,但经过一些研究,我得到了两个保留编译时类型安全的解决方案(更改EntityInterface.getItems()方法以返回set<?>是可行的,但不可接受):

  1. 使用实现接口的抽象类,而不是直接使用接口:
public interface ItemInterface {
  String getName();
}

public abstract class AbstractItem implements ItemInterface {
}

public class ItemA extends AbstractItem {
  public String getName() {
    return "ItemA";
  }
}

// ItemB same as ItemA

public interface EntityInterface {
  Set<? extends AbstractItem> getItems();
}

@NoArgsConstructor
@AllArgsConstructor
@Data
@With
public class EntityA implements EntityInterface {
  private Set<ItemA> items;
}

// EntityB same as EntityA, but with Set of ItemB
public S hasItems(AbstractItem... items) { /*...*/ }
    <build>
        <plugins>
            <plugin>
                <groupId>org.assertj</groupId>
                <artifactId>assertj-assertions-generator-maven-plugin</artifactId>
                <!-- ... -->
                <configuration>
                    <!-- ... -->
                    <!-- Exclude classes matching the regex from generation -->
                    <excludes>
                        <param>com.example.EntityInterface</param>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

以上配置防止生成AbstractEntityInterfaceAssert.java

我不知道这些变通方法是否适用于您的用例,不幸的是,我无法提供更好的解决方案或解释(这是AspectJ的bug或限制吗?)。最佳人选是Joel Costigliola--AssertJ的作者

有用的内容:

    null
 类似资料:
  • 假设我有一个,我这样做: ...通行证。现在我要检查获得的是否正确:

  • 本文向大家介绍nunit 基本流畅断言,包括了nunit 基本流畅断言的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 让我们假设我有一个类,它不实现,还有一个类,它实现。 使用AssertJ的fluent API,我现在假设可以执行以下操作: 由于不实现可比,将返回类型,并且由于也返回,所以我无法访问和方法,这些方法在接口中声明。 'only'返回而不返回有什么原因吗? 当然,我可以按照的内容重写上面的断言,但是表达式本身并不特别易读,而且如果出现故障,生成的消息('expected:<-1>大于:<0>)不会提

  • 我的流在数据库中配置,我的程序不断创建和销毁流。 因此,流配置(例如cron配置)可以随时更改。 这些流是用方法IntegrationFlowContext注册的。使用IntegrationFlowRegistration方法注册并销毁。销毁。 流的运行从第0秒开始,可以在任何一分钟开始。销毁和创建新流从每分钟1秒开始。 这是一个好方法吗?当我测试这个时,它起作用了。但我在想,这是一种很好的方法吗

  • 我使用,并在它停止开发后移到。 最近,我被指向Google repository和另一个断言库(http://Google.github.io/truth/)。 阅读这些示例,我没有发现使用start比使用有任何优势。所以用什么只是品味的问题。但也许我没抓住重点,是吗?

  • 我在我的活动中实现了一个视图寻呼机,在滚动时,将一组数据加载到适配器并将它们显示在列表视图中。一切正常,但我似乎无法找出如何使其更有效,因为滚动时,视图会冻结,但例如在GMAIL应用程序中,当在电子邮件之间滚动时,滚动是如此平滑。 下面是我正在使用的代码: 活动: 创建时 页面适配器: PagechAngelistener: