Правило JQassistant для TestMethods с лямбда-выражениями и потребителями утверждает
В нашем проекте есть несколько модульных тестов, в которых утверждения передаются в класс тестирования как лямбда или потребитель. Пример как ниже. Как написать ограничение правила шифрования, например, идентифицируются утверждения, а метод не помечается как без утверждения. В настоящее время используется junit4:TestMethodWithoutAssertion
Метод испытания:
@Test
public void testSuccessfulIdempotency(){
transportConsumerFlow.accept(Mockito.mock(TransRequest.class),
(t)->{
assertEquals(t, expectedResponseMessage);
});
}
В приведенном выше примере утверждение действительно присутствует и действует. Но концепция junit4:AssertMethod не может быть обнаружена, возможно, потому, что она присутствует в качестве потребителя вместо прямого вызова в методе Test.
1 ответ
В настоящее время лямбда-выражения явно не поддерживаются jQAssistant, но вы можете идентифицировать их как синтетические статические методы (генерируемые байт-кодом), используя следующую концепцию:
MATCH
(type:Type)-[:DECLARES]->(lambda:Method)
WHERE
exists(lambda.synthetic)
and exists(lambda.static)
and lambda.name starts with("lambda$")
SET
lambda:Lambda
WITH
type, lambda
MATCH
(type)-[:DECLARES]->(method:Method)
WHERE
method <> lambda
and method.firstLineNumber <= lambda.firstLineNumber
and method.lastLineNumber >= lambda.lastLineNumber
MERGE
(method)-[:DECLARES_LAMBDA]->(lambda)
RETURN
method, collect(lambda)
Вы не увидите никаких связей INVOKES от методов тестирования к лямбда-методам, поэтому необходимо использовать пользовательское ограничение со следующим запросом шифра (основанным на junit4:TestMethodWithoutAssertion):
MATCH
(testType:Type)-[:DECLARES]->(testMethod:Test:Method)
WHERE
NOT (testMethod)-[:INVOKES|DECLARES_LAMBDA*..3]->(:Method:Assert)
RETURN
testType AS DeclaringType,
testMethod AS Method