Правило JQassistant для TestMethods с лямбда-выражениями и потребителями утверждает - PullRequest
0 голосов
/ 27 апреля 2018

В нашем проекте есть несколько модульных тестов, в которых утверждения передаются как класс лямбда или потребитель. Пример как ниже. Как записать ограничение правила шифрования , такое, что утверждения идентифицированы, а метод не помечен как без утверждения. В настоящее время используется junit4: TestMethodWithoutAssertion

Метод испытания:

     @Test 
     public void testSuccessfulIdempotency(){
     transportConsumerFlow.accept(Mockito.mock(TransRequest.class), 
     (t)->{
           assertEquals(t, expectedResponseMessage);
      });
     }

В приведенном выше примере утверждение действительно присутствует и действует. Но концепция junit4: AssertMethod не может быть обнаружена, возможно, потому что она присутствует в качестве потребителя вместо прямого вызова в методе Test.

1 Ответ

0 голосов
/ 30 апреля 2018

Лямбда-выражения в настоящее время явно не поддерживаются 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
...