我有一个有效的 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不限于子字符串检查)。
我想为一个类似数据库的小型应用程序编写一个测试。此应用程序使用查询,查询应返回正确的结果。这在 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代理。eclipse中的开发很好,然后我将代理程序投入生产并发出以下消息:
No compatible attachment provider is available
以及从行开始的一些堆栈跟踪
static {
ByteBuddyAgent.install();
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个带有边和节点的图实现。该图应同时访问,因此我选择将 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) 我有一个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)