Zapisy otwarte! Dołącz do kursu Selenium w Javie lub Selenium w C#. Tylko do 23.09.2021 do godz. 21:00. Zapisz się tutaj.

API w REST Assured 4. Pierwszy test API – metoda GET

W tej lekcji napiszemy pierwszy test API ale już nie w Postmanie, a przy użyciu REST Assured.

Dokumentacja do sklepu

Po poprawnym postawieniu aplikacji dokumentację do niej znajdziesz pod localhost/fakestore/dokumentacja/. Tam też znajdziesz np. klucze potrzebne do uwierzytelnienia.

Error:java: error: release version 5 not supported

Jeżeli zobaczysz ten błąd w trakcie uruchamiania swojego testu, zajrzyj tutaj. Znajdziesz tam informacje jak rozwiązać ten problem.

Wersja Javy

W zależności od tego której wersji Javy używasz, mogą się pojawić drobne rozbieżności w działaniu poniższej linijki i podobnych sytuacji, w których pobieramy jakąś informację z odpowiedzi metodą get(), a następnie ją „wypluwamy” w konsoli metodą println:

System.out.println(response.jsonPath().get("name"));

Jeżeli nie zadziała Ci to, co pokazuję (będzie się podkreślało na czerwono i po najechaniu zobaczysz „Ambiguous method call”) możesz zamiast get() użyć metody getString():

System.out.println(response.jsonPath().getString("name"));

Pierwszy test API: linki i materiały

OAuth

W tej lekcji poznamy kolejną metodę przekazywania danych do logowania, a mianowicie OAuth1. Jest to sposób autoryzacji, który poprzez haszowanie przesyłanych danych nadaje się do wykorzystania w nieszyfrowanej komunikacji po http (bez “s”). Rezygnujemy z korzystania z https w przypadku naszego sztuczno-sklepu, ze względu na problemy z certyfikatami przy lokalnym jego postawieniu. Użycie OAuth jest w naszym przypadku prostsze. Będzie to też doskonała okazja, żeby zobaczyć i użyć innych metod autoryzacyjnych.

Pierwszy test API

Po bardzo poważnej zmianie, jaką jest zmiana motywu Postmana na ciemny (!) wyślemy z niego zapytanie o konkretny produkt (pojedynczy obiekt). Z takim działającym testem przeniesiemy się już do kodu i przepiszemy go używając REST Assured. 

Zaczniemy od stworzenia projektu mavenowego, dodania potrzebnych zależności, w tym także tych, które będą nam potrzebne do używania OAuth. Więcej o tym mówię w filmie. Stworzymy też nową klasę testową. Zainicjalizujemy tam pola klasy wartościami, z których skorzysta nasz pierwszy test API.

Odpowiedź

W teście stworzymy sobie obiekt klasy implementującej interfejs Response zwracany przez metodę get(). Poznacie (lub przypomnicie sobie) podejście BDD (Behavior-Driven Development), czyli gherkinową notację Given-When-Then. To jej będziemy używać do budowania obiektu. Na razie poprzestaniemy na przygotowaniu, czyli metodzie given() i akcji, czyli metodzie when().  Żeby test był testem dodam także prostą asercję sprawdzającą kod odpowiedzi. To czy sprawdzanie samego kodu odpowiedzi w testach jest wystarczające pozostawiam każdej i każdemu z Was do rozważenia we własnym sercu i umyśle. Na pewno pod uwagę trzeba wziąć przede wszystkim co chcemy testem sprawdzić.

W filmie pokazuję też jak pobierać informacje z naszego obiektu reprezentującego odpowiedź. Można pracować na całej odpowiedzi albo tylko na poszczególnych jej elementach. Którego podejścia będziecie użyć w prawdziwym życiu, to już zależy od Was. Standardowo zapytany o to, które jest lepsze odpowiem: to zależy.

Co poćwiczyć?

Zadaniem domowym jest zmiana tego co mamy. Spróbuj wywołać inne kody odpowiedzi, w tym kod 403. Pobaw się też trochę odpowiedzią z API, poćwicz trochę wyciąganie różnych informacji pojedynczo (tak jak zrobiłem to z „name” w filmie).

Pierwszy test API – kod

Ukryta treść

Nie masz dostępu do tego kursu. Wykup dostęp albo zaloguj się, by móc zobaczyć pełną lekcję.

Wsparcie merytoryczne

Nie masz dostępu do wsparcia merytorycznego dla tego kursu. Wykup dostęp albo zaloguj się, by móc zadawać pytania.

  1. Mam problem z pobraniem zależności przez Intellij. Po uzupełnieniu pliku pom.xml, zgodnie z wzorem wszystkie zależności oznaczone są na czerwono oraz przykładowo otrzymuję komunikat "Dependency 'com.github.scribejava:scribejava-apis:2.5.3' not found".

    Odpowiedz
  2. Działa wszystko, poza linijką:
    System.out.println(response.jsonPath().get("name"));

    Wpisywałem z palca, próbowałem skopiować - za każdym razem podkreślone na czerwono z adnotacją:
    Ambiguous method call. Both
    println
    (char[])
    in PrintStream and
    println
    (String)
    in PrintStream match

    Przy kompilacji:
    [quote]Error:(29, 19) java: reference to println is ambiguous
    both method println(char[]) in java.io.PrintStream and method println(java.lang.String) in java.io.PrintStream match[/quote]

    Odpowiedz
  3. Jak najlepiej zrobić assercję na response.statusCode(), jeśli w odpowiedzi spodziewam się statusu 200 lub 409(obiekt został stworzony lub już istnieje)? Jest jakiś elegancki sposób na ogarnięcie tego?

    Odpowiedz
      • Dzięki za odpowiedź Kuba. Co do 200 przy tworzeniu obiektu to wiem, że tak nie powinno być, niestety developerzy u mnie w zespole są innego zdania...
        Tak jak napisałeś, potrzebuję tej asercji w ramach przygotowania danych przed właściwym testem, sama funkcjonalność jest sprawdzana mnóstwem innych testów.

        Odpowiedz
  4. Cześć prośba o pomoc,
    w kodzie dostaje 401,
    kod:

     
    import io.restassured.response.Response;
    import org.junit.jupiter.api.Test;
    
    import static io.restassured.RestAssured.given;
    
    public class FirstGet {
        private String username = "ck_8da07afd3503a4242e95a2d5bad99cc2fb55c552";
        private String password = "cs_e57e8cadc42ca42064c44239853dda9aa2e77474";
        private String url = "http://localhost/fakestore/wp-json/wc/v3/";
        private String productsEndpoint = "products";
        private String productFuerta = "393";
        @Test
        public void firstGetTest() {
            Response response = given()
                    .port(8080)
                    .auth()
                    .oauth(username, password, "", "")
                    .when()
                    .get(url + productsEndpoint + "/" + productFuerta);
    
            System.out.println(response.prettyPeek()); // prettyPeek - ładnie wypisze response
        }
    } 

    .

    Odpowiedź:

    HTTP/1.1 401 Unauthorized
    Date: Thu, 23 Jul 2020 10:59:52 GMT
    Server: Apache/2.4.43 (Win64) OpenSSL/1.1.1g PHP/7.4.8
    X-Powered-By: PHP/7.4.8
    X-Robots-Tag: noindex
    Link: ; rel="https://api.w.org/"
    X-Content-Type-Options: nosniff
    Access-Control-Expose-Headers: X-WP-Total, X-WP-TotalPages
    Access-Control-Allow-Headers: Authorization, Content-Type
    Vary: Origin
    Content-Length: 140
    Keep-Alive: timeout=5, max=100
    Connection: Keep-Alive
    Content-Type: application/json; charset=UTF-8

    {
    "code": "woocommerce_rest_authentication_error",
    "message": "Nieprawidłowy podpis - podany podpis jest niezgodny.",
    "data": {
    "status": 401
    }
    }
    io.restassured.internal.RestAssuredResponseImpl@346a361

    Process finished with exit code 0

    Postman - OAuth 1.0 po usunięci "s" dostaje "Could not send request", z "s" działa i zwraca produkt
    Console:
    GET http://localhost/fakestore/wp-json/wc/v3/products/393?oauth_consumer_key=ck_8da07afd3503a4242e95a2d5bad99cc2fb55c552&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1595502710&oauth_nonce=wHRISb0ZMTu&oauth_version=1.0&oauth_signature=YH2dFwICU4MbSIhB2o3Iroa1DI0=
    Error: connect ECONNREFUSED 127.0.0.1:80
    Request Headers
    User-Agent: PostmanRuntime/7.26.1
    Accept: */*
    Postman-Token: b6ba60e2-6aca-4ba2-a3f5-afaf1d8cee2a
    Host: localhost
    Accept-Encoding: gzip, deflate, br

    Odpowiedz
      • Cześć dzięki za podjęcie tematu
        Postman:
        {
        "code": "woocommerce_rest_authentication_error",
        "message": "Nieprawidłowy podpis - podany podpis jest niezgodny.",
        "data": {
        "status": 401
        }
        }

        Kod:
        22:22 GMT
        Server: Apache/2.4.43 (Win64) OpenSSL/1.1.1g PHP/7.4.8
        X-Powered-By: PHP/7.4.8
        X-Robots-Tag: noindex
        Link: ; rel="https://api.w.org/"
        X-Content-Type-Options: nosniff
        Access-Control-Expose-Headers: X-WP-Total, X-WP-TotalPages
        Access-Control-Allow-Headers: Authorization, Content-Type
        Vary: Origin
        Content-Length: 140
        Keep-Alive: timeout=5, max=100
        Connection: Keep-Alive
        Content-Type: application/json; charset=UTF-8

        {
        "code": "woocommerce_rest_authentication_error",
        "message": "Nieprawidłowy podpis - podany podpis jest niezgodny.",
        "data": {
        "status": 401
        }
        }
        io.restassured.internal.RestAssuredResponseImpl@631e06ab

        Odpowiedz
          • Dobra, to teraz dwa dodatkowe pytania na zbadanie: [...] Całość odpowiedzi widoczna dla kursantów.

          • Tak otwiera się ale pojawia się komunikat "Połączenie nie jest prywatne" i dopiero po zatwierdzeniu w zaawansowanych przechodzi.

            https://snipboard.io/Qlw7e8.jpg

          • Ale po zatwierdzeniu jest ok? masz sklep z produkt [...] Całość odpowiedzi widoczna dla kursantów.

          • FakeStore działa:
            https://snipboard.io/95UMfc.jpg
            ale po zmianie zakładki na stronie np. na "sklep" znowu trzeba w zaawansowanych potwierdzać.

            Testowałem poniższe opcje:
            http://localhost:8080/fakestore/wp-json/wc/v3/products/393
            http://localhost:8080/fakestore/wp-json/wc/v2/products/393
            {
            "code": "woocommerce_rest_authentication_error",
            "message": "Nieprawidłowy podpis - podany podpis jest niezgodny.",
            "data": {
            "status": 401
            }
            }

            http://localhost/fakestore/wp-json/wc/v3/products/393
            http://localhost/fakestore/wp-json/wc/v2/products/393
            Error: connect ECONNREFUSED 127.0.0.1:80

            https://localhost:8080/fakestore/wp-json/wc/v3/products/393
            https://localhost:8080/fakestore/wp-json/wc/v2/products/393
            Error: write EPROTO 3074956808:error:100000f7:SSL routines:OPENSSL_internal:WRONG_VERSION_NUMBER:../../third_party/boringssl/src/ssl/tls_record.cc:242:

            https://localhost/fakestore/wp-json/wc/v2/products/393
            https://localhost/fakestore/wp-json/wc/v3/products/393
            działa w Postmanie, w kodzie nie

  5. Cześć,
    możecie rzucić pomysłem w jaki sposób wywołać kod 403 - Forbidden?
    Miałam kilka pomysłów, ale wszystkie wywołują albo 404 albo exceptiony 🙂
    Z góry dzięki!

    Odpowiedz
  6. Test failuje, mimo dodanych zależności w pom.xml jest problem z autoryzacją, co może być przyczyną?

    java.lang.NoClassDefFoundError: com/github/scribejava/core/model/AbstractRequest

    at io.restassured.internal.http.AuthConfig.oauth(AuthConfig.java:183)
    at io.restassured.internal.http.AuthConfig$oauth.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:166)
    at io.restassured.authentication.OAuthScheme.authenticate(OAuthScheme.groovy:35)
    at io.restassured.authentication.AuthenticationScheme$authenticate.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139)
    at io.restassured.internal.RequestSpecificationImpl.sendRequest(RequestSpecificationImpl.groovy:1172)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1268)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1035)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:819)
    at groovy.lang.GroovyObject.invokeMethod(GroovyObject.java:39)
    at org.codehaus.groovy.runtime.callsite.PogoInterceptableSite.call(PogoInterceptableSite.java:45)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:166)
    at io.restassured.internal.filter.SendRequestFilter.filter(SendRequestFilter.groovy:30)
    at io.restassured.filter.Filter$filter$0.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
    at io.restassured.filter.Filter$filter.call(Unknown Source)
    at io.restassured.internal.filter.FilterContextImpl.next(FilterContextImpl.groovy:72)
    at io.restassured.filter.time.TimingFilter.filter(TimingFilter.java:56)
    at io.restassured.filter.Filter$filter.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:157)
    at io.restassured.internal.filter.FilterContextImpl.next(FilterContextImpl.groovy:72)
    at io.restassured.filter.FilterContext$next.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:148)
    at io.restassured.internal.RequestSpecificationImpl.applyPathParamsAndSendRequest(RequestSpecificationImpl.groovy:1655)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1268)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1035)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:819)
    at groovy.lang.GroovyObject.invokeMethod(GroovyObject.java:39)
    at org.codehaus.groovy.runtime.callsite.PogoInterceptableSite.call(PogoInterceptableSite.java:45)
    at org.codehaus.groovy.runtime.callsite.PogoInterceptableSite.callCurrent(PogoInterceptableSite.java:55)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:51)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:171)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:203)
    at io.restassured.internal.RequestSpecificationImpl.applyPathParamsAndSendRequest(RequestSpecificationImpl.groovy:1661)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1268)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1035)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:819)
    at groovy.lang.GroovyObject.invokeMethod(GroovyObject.java:39)
    at org.codehaus.groovy.runtime.callsite.PogoInterceptableSite.call(PogoInterceptableSite.java:45)
    at org.codehaus.groovy.runtime.callsite.PogoInterceptableSite.callCurrent(PogoInterceptableSite.java:55)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:51)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:171)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:203)
    at io.restassured.internal.RequestSpecificationImpl.get(RequestSpecificationImpl.groovy:171)
    at io.restassured.internal.RequestSpecificationImpl.get(RequestSpecificationImpl.groovy)
    at FirstTest.getProduct(FirstTest.java:23)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:675)
    at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:125)
    at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:132)
    at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:124)
    at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:74)
    at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:104)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:62)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:43)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:35)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:202)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:198)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229)
    at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197)
    at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
    at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)
    Caused by: java.lang.ClassNotFoundException: com.github.scribejava.core.model.AbstractRequest
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    ... 138 more

    Class transformation time: 2.608154277s for 2538 classes or 0.0010276415591016549s per class

    Process finished with exit code -1

    Odpowiedz
  7. O matko bosko, ale mnie czasami mózgownica zawodzi, zostawię ten komentarz dla potomnych, jakoby ktoś miał podobną zagwozdkę: otóż zwyczajnie zapomniałem zmienić url (przepisywałem jak maszyna z ekranu wszystko)i wywołanie przechodziło jako 200, ale zawartość mówiła, że coś nadal nie działa. [zacząłem zmieniać porty, instalowałem inną wersję php, znalazłem jakiś filmik instruktażowy jakiegoś łebskiego pana pochodzenia indyjskiego... i zostawiłem to, a następnego dnia przeglądam kod i widzę tego slasha]
    Więc mój błędny kod to: private String url = "http://fakestore/local/wp-json/wc/v3/";
    a mój docelowy / bieżący /działający to: private String url = "http://fakestore.local/wp-json/wc/v3/";

    Odpowiedz