在Grails中使用自定义hamcrest匹配器时遇到问题.使用我的匹配器运行测试失败:
java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V
Run Code Online (Sandbox Code Playgroud)
经过一些谷歌搜索后,似乎这是由加载的库的顺序引起的:JUnit和Hamcrest.我在BuildConfig.groovy中添加了以下依赖项:
dependencies {
test 'org.hamcrest:hamcrest-all:1.3'
}
Run Code Online (Sandbox Code Playgroud)
根据我能够找到的指令,可以通过确保在JUnit之前加载hamcrest类来解决这个问题.我不知道如何在Grails中实现这一点,或者如何以任何其他方式解决这个问题.
使用Grails 2.2.1
Java Pattern该类的标准实现使用递归来实现许多形式的正则表达式(例如,某些运算符,交替).
这种方法导致堆栈溢出问题,输入字符串超过(相对较小)长度,甚至可能不超过1,000个字符,具体取决于所涉及的正则表达式.
一个典型的例子是以下正则表达式,使用交替Data从周围的XML字符串中提取可能的多行元素(命名),该字符串已经提供:
<Data>(?<data>(?:.|\r|\n)+?)</Data>
Run Code Online (Sandbox Code Playgroud)
上面的正则表达式用于Matcher.find()读取"数据"捕获组并按预期工作的方法,直到提供的输入字符串的长度超过1,200个字符左右,在这种情况下,它会导致堆栈溢出.
是否可以重写上述正则表达式以避免堆栈溢出问题?
Specs2 中有很多关于如何检查相等性的示例,但没有关于如何检查不相等性的示例。
我尝试了(除其他外)以下方法,但它不起作用:
"type safe get should work" in {
Get("/SimpleLine") ~> getRoute[SimpleLine] ~> check {
responseAs[String] shouldEqual "my name is SimpleLine"
responseAs[String] shouldNot equal to "my name is SimpleLine2"
}
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
如何检查 Specs2 中的不相等性?
谷歌没有提供帮助。
我有一个带有 SpecialObject 集合的测试结果。SpecialObject 具有“name”和“surname”作为属性。我想测试该集合是否包含具有 2 个特定属性“name=myname”和“surname=lastname”的 specialObject。
这是我尝试过但没有成功的方法:
assertThat(result, Matchers.<SpecialObject>hasItem(
allOf(
hasProperty("name", equalTo("myname")),
hasProperty("surname", equalTo("lastname"))
));
Run Code Online (Sandbox Code Playgroud) 因此,当我们需要将一些 HTML 解析为 XML 并验证 HTML 中的所有内容都在 XML 文件中时,我们使用 Unittests 中的 Hamcrest 进行验证。由于我们不能在 XML 文件中包含更多或更少的信息,因此我们有一个不使用contains而是使用 的匹配器很重要equalTo。问题是我们解析但必须提取某些元素,因为它们在外部管理的数据模型中是不允许的。我们发现这样做在某些情况下会增加额外的空格(与 Jsoup 有关系)。
因此,由于空间与实际内容无关,我们决定暂时忽略它们(因为这纯粹是 PoC),但我们确实希望验证我们的概念。为此,我想出了一个解决方案,它去除每个空格 ( String.replaceAll("\\s","")),同时去除换行符和制表符。然后将所有文本连接成一个 String 对象,这使得阅读非常糟糕,而且在调试时也不是一个很好的做法。所以我选择使用 Hamcrests IsEqualIgnoringWhitespace. 在测试时,我发现它根本没有像名字所暗示的那样做任何事情。在代码中没有删除空格、制表符或换行符,而是检查当前字符是否为空格,如果是,则之前的字符是否也包含空格。如果是这种情况,它将删除一个空格。因此,基本上它只会将空格标准化为在两个单词之间仅包含其中一个。
下面是stripSpace类中使用的方法的代码:
public String stripSpace(String toBeStripped) {
final StringBuilder result = new StringBuilder();
boolean lastWasSpace = true;
for (int i = 0; i < toBeStripped.length(); i++) {
char c = toBeStripped.charAt(i);
if (isWhitespace(c)) {
if (!lastWasSpace) {
result.append(' ');
}
lastWasSpace = true;
} else { …Run Code Online (Sandbox Code Playgroud) 我编写了一个 AST 匹配器来查找特定类型语句。在匹配的节点中,我计算了该节点的邻居兄弟节点。现在我需要在邻居节点上运行匹配器来验证它们是否满足我的条件。clang AST 匹配器将整个树节点一一匹配。我想针对特定节点运行匹配器,如果该节点符合我所需的条件,则返回 true。这可能吗?
我想删除句子的引号.
ex)萨克勒画廊推迟备受争议的"海难"节目 - >萨克勒画廊推迟备受争议的沉船展
我知道可以使用Patter - Matcher - 替换.但我不知道如何使用它.
static String getText(String content) {
Pattern NOQMARK = Pattern.compile("A");
Matcher m;
m = SCRIPTS.matcher(content);
content = m.replaceAll("");
return content
}
我应该把什么放在"A"中?
任何建议对我都有帮助.谢谢.
我编写了以下使用的JUnit测试ArgumentMatchers。
MyClass classUnderTest = new MyClass();
class AnyBooleanMatcher extends ArgumentMatcher<Boolean> {
public boolean matches(Object argument) {
return ((Boolean) argument).equals(Boolean.TRUE);
}
}
class MyObjectMatcher extends ArgumentMatcher<MyObject> {
public boolean matches(Object argument) {
return ((MyObject) argument).getValue().equals("123");
}
}
final Service mockService = mock(Service.class);
when(mockService.search(Matchers.argThat(new MyObjectMatcher()),
Matchers.argThat(new AnyBooleanMatcher())));
classUnderTest.callMethod(mock(ActionEvent.class));
verify(mockService).search(Matchers.argThat(new MyObjectMatcher()),
Matchers.argThat(new AnyBooleanMatcher()));
Run Code Online (Sandbox Code Playgroud)
不幸的是,我NullPointerException在when声明中总是收到。
我什至知道为什么:argThat返回nullJavaDoc中指定的。但是,我不知道为什么示例中的建模方式完全相同时,我的测试为什么不起作用。
我有一个下面的代码和平:
Pattern p = Pattern.compile("^\\d|^\\W|^\\s");
Matcher m = p.matcher("stack overflow");
Run Code Online (Sandbox Code Playgroud)
有人可以解释上面的正则表达式吗?它能做什么 ?我必须使它与现有功能之间不允许空格.例如,它不应允许"堆栈溢出",因为它包含空格.
编辑
我尝试的模式下面对我来说很好.谢谢大家的建议:
[a-zA-Z0-9_$#]
Run Code Online (Sandbox Code Playgroud) 为什么这段代码:
String keyword = "pattern";
String text = "sometextpatternsometext";
String patternStr = "^.*" + keyword + ".*$"; //
Pattern pattern = Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
int start = matcher.start();
int end = matcher.end();
System.out.println("start = " + start + ", end = " + end);
}
Run Code Online (Sandbox Code Playgroud)
start = 0,end = 23
不能正常工作.
但是,这段代码:
String keyword = "pattern";
String text = "sometext pattern sometext";
String patternStr = "\\b" + keyword + "\\b"; //
Pattern pattern = …Run Code Online (Sandbox Code Playgroud) matcher ×10
java ×7
hamcrest ×3
regex ×3
junit ×2
clang ×1
classloader ×1
grails ×1
mocking ×1
mockito ×1
scala ×1
specs2 ×1
spring-boot ×1
substring ×1
unit-testing ×1
whitespace ×1