Estoy corriendo mi mediante pruebas de gradle testFlavorType

JSONObject jsonObject1 = new JSONObject();
JSONObject jsonObject2 = new JSONObject();
jsonObject1.put("test", "test");
jsonObject2.put("test", "test");
assertEquals(jsonObject1.get("test"), jsonObject2.get("test"));

La citada prueba se realiza correctamente.

jsonObject = new SlackMessageRequest(channel, message).buildBody();
String channelAssertion = jsonObject.getString(SlackMessageRequest.JSON_KEY_CHANNEL);
String messageAssertion = jsonObject.getString(SlackMessageRequest.JSON_KEY_TEXT);
assertEquals(channel, channelAssertion);
assertEquals(message, messageAssertion);

Pero los dos anteriores las solicitudes de un error. La traza de la pila dice que channelAssertion y messageAssertion son nulos, pero no sé por qué. Mi pregunta es: ¿por Qué son los dos anteriores se afirma fallando?

A continuación es la SlackMessageRequest.

public class SlackMessageRequest
        extends BaseRequest {
    //region Variables

    public static final String JSON_KEY_TEXT = "text";
    public static final String JSON_KEY_CHANNEL = "channel";

    private String mChannel;
    private String mMessage;

    //endregion

    //region Constructors

    public SlackMessageRequest(String channel, String message) {
        mChannel = channel;
        mMessage = message;
    }

    //endregion

    //region Methods

    @Override
    public MethodType getMethodType() {
        return MethodType.POST;
    }    

    @Override
    public JSONObject buildBody() throws JSONException {
        JSONObject body = new JSONObject();
        body.put(JSON_KEY_TEXT, getMessage());
        body.put(JSON_KEY_CHANNEL, getChannel());
        return body;
    }

    @Override
    public String getUrl() {
        return "http://localhost:1337";
    }

    public String getMessage() {
        return mMessage;
    }

    public String getChannel() {
        return mChannel;
    }

//endregion
}

A continuación es el stacktrace:

junit.framework.ComparisonFailure: expected:<@tk> but was:<null>
at junit.framework.Assert.assertEquals(Assert.java:100)
at junit.framework.Assert.assertEquals(Assert.java:107)
at junit.framework.TestCase.assertEquals(TestCase.java:269)
at com.example.app.http.request.SlackMessageRequestTest.testBuildBody(SlackMessageRequestTest.java:30)
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:483)
at junit.framework.TestCase.runTest(TestCase.java:176)
at junit.framework.TestCase.runBare(TestCase.java:141)
at junit.framework.TestResult$1.protect(TestResult.java:122)
at junit.framework.TestResult.runProtected(TestResult.java:142)
at junit.framework.TestResult.run(TestResult.java:125)
at junit.framework.TestCase.run(TestCase.java:129)
at junit.framework.TestSuite.runTest(TestSuite.java:252)
at junit.framework.TestSuite.run(TestSuite.java:247)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:86)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:86)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:49)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:64)
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:50)
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:483)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:106)
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:483)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:360)
at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

EDITAR 5:55PM EST

He descubierto que puedo registro con System.out.println("") y, a continuación, ver los resultados, mediante la ejecución de gradle testFlavorType --debug y por ensayo y error, he descubierto el siguiente extraña situación:

@Override
public JSONObject buildBody() throws JSONException {
System.out.println("buildBody mChannel = " + mChannel);
System.out.println("buildBody mMessage = " + mMessage);
JSONObject body = new JSONObject();
body.put(JSON_KEY_TEXT, getMessage());
body.put(JSON_KEY_CHANNEL, getChannel());
if (body.length() != 0) {
Iterator<String> keys = body.keys();
if (keys.hasNext()) {
do {
String key = keys.next();
System.out.println("keys: " + key);
} while (keys.hasNext());
}
} else {
System.out.println("There are no keys????");
}
return body;
}

Por alguna razón, «no Hay llaves????» es la impresión?!?!?!?! Por qué?!

EDITAR 6:20 PM EST

He encontrado la manera para la depuración de las pruebas de unidad. De acuerdo con el depurador, el asignado JSONObject está volviendo "null". No tengo ni idea de lo que esto significa (ver más abajo). Ya que creo que esto es relevante, a mi gradle archivo incluye los siguientes:

testOptions {
unitTests.returnDefaultValues = true
}

Es especialmente raro, porque si me la construcción de un JSONObject dentro de la prueba, entonces todo funciona bien. Pero si es parte de la original de código de la aplicación, entonces no funciona, y no el de arriba.

¿Por qué mi JSONObject relacionados con la unidad de prueba fallando?

  • Por favor, añada la traza de la pila.
  • He añadido el seguimiento de la pila.
  • Que utiliza para trabajar, pero parece que se tiene que ejecutar en la instrumentación artefacto ahora.
InformationsquelleAutor tambykojak | 2015-09-03

3 Comentarios

  1. 47

    La clase JSONObject es parte del SDK de android. Eso significa que no está disponible para pruebas de unidad por defecto.

    De http://tools.android.com/tech-docs/unit-testing-support

    La android.jar archivo que se utiliza para ejecutar las pruebas unitarias no contiene
    cualquier código real – que es proporcionada por el sistema Android de imagen real
    los dispositivos. En su lugar, todos los métodos de lanzar excepciones (por defecto). Este es
    para asegurarse de que su unidad de pruebas sólo prueba su código, y no dependen de
    cualquier comportamiento particular de la plataforma Android (que no han
    explícitamente se burlaban por ejemplo, el uso de Mockito).

    Al establecer las opciones de la prueba a

    testOptions {
    unitTests.returnDefaultValues = true
    }

    usted está arreglando el «Método … no puede ser burlado.» el problema, pero el resultado es que cuando se utiliza el código new JSONObject() usted no está utilizando el método real, se utiliza un método ficticio que no hace nada, sólo se devuelve un valor predeterminado. Esa es la razón por la que el objeto es null.

    Usted puede encontrar diferentes formas de resolver el problema en esta pregunta: Android métodos no son burlados cuando se utiliza Mockito

  2. 54

    Como Lucas dice, JSON se incluye con el SDK de Android, por lo que están trabajando con un stub.

    La solución actual es para tirar JSON desde Maven Central como esto:

    dependencies {
    ...
    testCompile 'org.json:json:20180130'
    }

    Alternativamente, usted puede descargar e incluir el frasco:

    dependencies {
    ...
    testCompile files('libs/json.jar')
    }

    Es no se conoce que la versión de maven artefacto corresponde exactamente/más de cerca a qué se incluye con Android.

    Tenga en cuenta que también es necesario utilizar Android Studio 1.1 o superior y al menos de las herramientas de generación de la versión 22.0.0 o por encima para que esto funcione.

    Relacionados con el tema: #179461

    • Esto ya no funciona para mí. Lo hizo en un viejo proyecto, pero ahora voy a poner null al intentar crear un nuevo JSONObject. Estoy usando testCompile 'org.json:json:20160810'. También traté de configurations.all { resolutionStrategy.force 'org.json:json:20160810' }, pero no hubo suerte. Alguna idea?
    • Acabo de encontrar esto en mi gradle de salida: WARNING: Dependency org.json:json:20160810 is ignored for flavorDebug as it may be conflicting with the internal version provided by Android. In case of problem, please repackage with jarjar to change the class packages
    • Gracias. No tienes idea de lo mucho que esta solución ayuda a que mi presión arterial.
    • Ja, ja … sí … yo me ayudaron mucho! +1
    • muy útil. muchas gracias!
    • La versión es muy antigua y puede que no funcione. Uso org.json:json:20180130.
    • He actualizado la versión, gracias.
    • solucionado el problema con Roboelectric

  3. 0

    Bueno, mi primer presentimiento de que sería que su getMessage() método devuelve null. Usted podría mostrar el cuerpo de ese método en su pregunta y nos tienen a encontrar la respuesta para usted, pero usted debe probablemente a la investigación de cómo depurar aplicaciones android utilizando los puntos de interrupción.

    De esa manera usted puede ejecutar el código paso a paso y ver los valores de cada variable en cada paso. Que mostraría su problema en ningún momento, y es una habilidad que sin duda debe maestro tan pronto como sea posible si usted tiene la intención de obtener en serio que intervienen en la programación.

    • Gracias por la respuesta y la sugerencia. Ya he proporcionado el cuerpo de la getMessage() método. Es parte de la SlackMessageRequest, no te ves en eso? No veo cómo podría ser nulo sin embargo. Estoy muy familiarizado con la depuración, pero yo soy la ejecución de estas pruebas en la terminal así que no he descubierto una forma de depurar el sistema. Sugerencias sobre ¿cómo puedo lograr eso?
    • tal vez esto puede ayudar a bignerdranch.com/blog/… mi próximo corazonada sería que message y channel son null cuando se pasa en el constructor. No mostrar la parte de código donde puede inicializar las variables. Si la configuración de un entorno de depuración es demasiado complicado, siempre se puede añadir temporal de registro entre algunas de las líneas.
    • He leído que el blog varias veces, pero no resolver el problema. Incluso si channel y test son null, la prueba debe pasar basa en la lógica de siempre.
    • Sí, se debe trabajar con null, tienes razón. De todos modos. Agregar algunos registro o simple System.out.println en las partes clave, y ver donde la nulls vienen.

Dejar respuesta

Please enter your comment!
Please enter your name here