小编Cor*_*onA的帖子

使用 assertJ 断言列表元素的属性

我有一个有效的 hamcrest 断言:

assertThat(mylist, contains(
  containsString("15"), 
  containsString("217")));
Run Code Online (Sandbox Code Playgroud)

预期的行为是:

  • mylist == asList("Abcd15", "217aB") => 成功
  • myList == asList("Abcd15", "218") => 失败

如何将此表达式迁移到 assertJ。当然,存在一些幼稚的解决方案,例如断言第一个和第二个值,如下所示:

assertThat(mylist.get(0)).contains("15");
assertThat(mylist.get(1)).contains("217");
Run Code Online (Sandbox Code Playgroud)

但这些是对列表元素的断言,而不是对列表的断言。在列表上尝试断言将我限制为非常通用的函数。所以也许它只能通过自定义断言来解决,如下所示就可以了:

assertThat(mylist).elements()
  .next().contains("15")
  .next().contains("217")
Run Code Online (Sandbox Code Playgroud)

但是在我编写自定义断言之前,我会对其他人如何解决这个问题感兴趣?

编辑:一个额外的非功能性要求是,测试应该可以通过额外的约束轻松扩展。在 Hamcrest 中很容易表达额外的约束,例如

assertThat(mylist, contains(
  emptyString(),                                     //additional element
  allOf(containsString("08"), containsString("15")), //extended constraint
  containsString("217")));                           // unchanged
Run Code Online (Sandbox Code Playgroud)

对于此示例,依赖于列表索引的测试必须重新编号,使用自定义条件的测试必须重写完整条件(请注意,中的约束allOf不限于子字符串检查)。

java junit assertj

7
推荐指数
3
解决办法
2万
查看次数

JUnit 5 中的 beforeEach/beforeAll 参数化

我想为一个类似数据库的小型应用程序编写一个测试。此应用程序使用查询,查询应返回正确的结果。这在 JUnit 5 中很容易实现,比如

@BeforeEach
void before() {
  database = prepareDatabase();
}

@Test
void testQuery1() {
  assertThat(database.query("query1")).isEqualTo("result1");
}

@Test
void testQuery2() {
  assertThat(database.query("query2")).isEqualTo("result2");
}

....
Run Code Online (Sandbox Code Playgroud)

现在我想添加优化开关(例如查询优化器或数据库索引)。无论运行优化开关如何,查询都应该返回相同的结果(优化应该只改变效率而不是结果)。

对于测试,这意味着我想为其他一些实现prepareDatabase()(例如,一个带有优化器,一个带有索引,一个什么都没有)运行相同的方法。

我还没有找到合适的扩展名。我想为每个优化设置复制整个类或提供来自共享父类的方法。然而,这感觉不像 JUnit 5 完成这项任务的方式。也许有人可以给我指出一个可以帮助我解决这个问题的功能?

java parameterized junit5

7
推荐指数
1
解决办法
2672
查看次数

“没有兼容的附件提供程序可用”是什么意思

最近,我使用字节伙伴开发了一个Java代理。eclipse中的开发很好,然后我将代理程序投入生产并发出以下消息:

No compatible attachment provider is available

以及从行开始的一些堆栈跟踪

static {
  ByteBuddyAgent.install();
}
Run Code Online (Sandbox Code Playgroud)

java byte-buddy

4
推荐指数
1
解决办法
1051
查看次数

将 Arc<RwLock<T>> 转换为 Arc<RwLock<TraitObject>

我正在编写一个带有边和节点的图实现。该图应同时访问,因此我选择将 Edges 和 Nodes 构建为Arc<Mutex<dyn Edge>>and Arc<RwLock<dyn Node>>

不幸的是,我在连接节点/边时遇到编译错误the parameter type 'T' may not live long enough( Playground )。

pub trait Node {
  fn connect(&mut self, edge: EdgeRef);
}

pub type NodeRef = Arc<RwLock<dyn Node>>;

pub trait Edge {
  fn connect(&mut self, node: NodeRef);
}

pub type EdgeRef = Arc<Mutex<dyn Edge>>;

impl<T> Node for Arc<RwLock<T>>
where
  T: Node,
{
  fn connect(&mut self, edge_ref: EdgeRef) {
    let mut node = self.write().unwrap();
    let mut edge = edge_ref.lock().unwrap(); …
Run Code Online (Sandbox Code Playgroud)

generics clone traits rust trait-objects

2
推荐指数
1
解决办法
422
查看次数

允许空白部分ANTLR4

我有一个antlr4语法,专门用于嵌入到文本模板中的特定于域的语言.

有两种模式:

  • 文本(应保留空格)
  • 代码(应忽略空格)

示例语法部分:

template
  :  '{' templateBody '}'
  ;

templateBody
  : templateChunk*
  ;

templateChunk
  : code # codeChunk // dsl code, ignore whitespace
  | text # textChunk // any text, preserve whitespace
  ;
Run Code Online (Sandbox Code Playgroud)

规则code可以包含对template规则的嵌套引用.因此解析器必须支持嵌套空白/非空白部分.

也许lexer模式可以帮助 - 有一些缺点:

  • 必须在另一个编译器传递中解析代码段
  • 我怀疑嵌套部分是否可以正确映射

然而,最有希望的方法似乎是操纵隐藏的渠道.

我的问题:是否有最佳实践来满足这些要求?是否有一个示例语法,已经解决了类似的问题?

附录:

其余的语法可能如下所示:

code
  : '@' function
  ;

function
  : Identifier '(' argument ')'
  ;

argument
  : function
  | template
  ;

text
  : Whitespace+
  | Identifier
  | .+
  ; …
Run Code Online (Sandbox Code Playgroud)

java antlr antlr4

1
推荐指数
1
解决办法
2465
查看次数