Модульный тест Kotlin assertEquals не работает - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь кодировать юнит-тест в Android Studio.

В режиме отладки, когда я достигаю точки останова, у меня есть следующая переменная:

token!!.length = 392

И следующее утверждение никогда не подходит:

assertEquals(392, token!!.length)

Я не понимаю, как это может быть.

И вывод Run:

java.lang.AssertionError: 
Expected :392
Actual   :0
 <Click to see difference>

    at org.junit.Assert.fail(Assert.java:88)
    at org.junit.Assert.failNotEquals(Assert.java:834)
    at org.junit.Assert.assertEquals(Assert.java:118)
    at org.junit.Assert.assertEquals(Assert.java:144)
    at com.activity.screen.myapp.ExampleUnitTest.get_auth_token_isCorrect(ExampleUnitTest.kt:70)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

janv. 16, 2019 2:29:40 PM okhttp3.internal.platform.Platform log
INFOS: --> POST https://theauthwebsite/api/auth/token http/1.1

Process finished with exit code -1

Исходный код:

    var token: String? = "" 

    var user = user("support@mycompany.fr","aaaabbbb", "1") 

    AuthService.getAuthToken(user).enqueue(object : Callback<Result> { 

        override fun onResponse(call: Call<Result>, response: Response<Result>) { 
            if (response.isSuccessful) { 
                token = response.body()!!.result!!.token 
            } 
        } 

        override fun onFailure(call: Call<Result>, t: Throwable) { 
            token = ""; 
        } 
    }) 

    assertEquals(392, token!!.length)  // Here token really has a length of 392 so that it should be ok but it is not
}

РЕДАКТИРОВАТЬ: решение состоит в том, чтобы использовать синхронный запрос, чтобы код был изменен следующим:

token = authServices.getAuthToken(user).execute().body()!!.result!!.token

assertEquals(392, token!!.length)

Спасибо, ребята!

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Вы утверждаете слишком рано. Асинхронный запрос токена еще не завершен, когда тест достигает утверждения.

enqueue() пахнет как дооснащение. Вместо этого используйте execute(), чтобы сделать вызов синхронным.

0 голосов
/ 16 января 2019

Вы не ждете результата. Метод enqueue() выполняет запрос асинхронно. Это означает, что обратный вызов не будет происходить в том же потоке. После того, как вы сделали enqueue() вызов, assert будет немедленно вызван следующим. На данный момент ни один обратный вызов еще не был вызван, поэтому значение token еще не изменилось. Если вы хотите синхронно ждать результата, используйте execute() вместо enqueue().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...