[JAVA] So testen Sie den privaten Bereich mit JUnit

Testen Sie den privaten Bereich

Rufen Sie in Java Felder, Methoden und innere Klassen des privaten Bereichs extern auf Testen wir es mit JUnit.

Versuchen wir zunächst, mit JUnit zu testen.

error.png

Es liegt ein Kompilierungsfehler vor. Es ist eine Spezifikation. Kann nicht ausgeführt werden. Da es privat ist, kann es nicht wie öffentlich aufgerufen werden.

Also verwenden wir Reflection, um etwas Privates zu nennen.

Was ist Reflexion?

Reflection ist eine Art Java-Standardbibliothek. Es handelt sich um Informationen über die Klasse selbst. Als konkretes Beispiel Mit einer Zeichenfolge aus Klassenname, Methodenname und Feldname Generieren Sie diese Klasse, führen Sie Methoden aus und greifen Sie auf Felder zu Ich kann es schaffen

Das Folgende ist eine externe Site, aber es sieht zum Beispiel so aus. http://java.keicode.com/lang/reflection.php

"Wenn es so bequem ist, benutze es positiv." Sie können das denken. Reflection ist jedoch ein zweischneidiges Schwert. Seien Sie vorsichtig beim Umgang. ** Aber ich werde es vorstellen. ** **.

Probleme mit der Reflexion

Die Reflexion hängt davon ab, wie Sie es verwenden

Es gibt auch Probleme wie. ** Aber ich werde es vorstellen. ** **.

"Testen Sie den privaten Bereich mit JUnit" Dies liegt daran, dass es für einen begrenzten Zweck verwendet wird.

Kehren Sie zum Hauptthema zurück

Korrigieren wir die JUnit-Testklasse, die voller Fehler ist.

package jp.co.illmatics.sample;
/**
 *Zu testende Klasse
 */
@SuppressWarnings("unused")
public class PrivateSample {

    private String field = "Hello field!";

    private final String finalField = "Hello final field!";

    private String doIt()    {
        return "Hello method!";
    }

    private class InnerClass {
        public InnerClass() {

        }
        public String getInnerMethod() {
            return "Hello inner method!";
        }
    }
}
package jp.co.illmatics.sample;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.junit.Test;

import junit.framework.TestCase;

/**
 *Testklasse
 */
public class PrivateSampleTest extends TestCase {

    PrivateSample privateSample = new PrivateSample();
    String expected = "";
    String actual = "";

    @Test
    public void testField() throws Exception {
        final String fieldName = "field";
        expected = "Hello field!";
        actual = (String) getFieldValue(privateSample, fieldName);
        assertEquals(expected, actual);
    }

    @Test
    public void testFinalField() throws Exception {
        final String finalFieldName = "finalField";
        expected = "Hello updated final Field!";
        actual = (String) getUpdatedFinalFieldValue(privateSample, expected, finalFieldName);
        assertEquals(expected, actual);
    }

    @Test
    public void testMethod() throws Exception {
        final String methodName = "doIt";
        expected = "Hello method!";
        actual = (String) getMethodValue(privateSample, methodName);
        assertEquals(expected, actual);
    }

    @Test
    public void testInnerClassMethod() throws Exception {
        final String innerClassName = "jp.co.illmatics.sample.PrivateSample$InnerClass";
        final String innerMethodName = "getInnerMethod";
        expected = "Hello inner method!";
        actual = (String) getInnerClassMethod(privateSample, innerClassName, innerMethodName);
        assertEquals(expected, actual);
    }

    private Object getFieldValue(PrivateSample privateSample, String fieldName)
            throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException,
            SecurityException {
        return getPrivateField(privateSample, fieldName).get(privateSample);
    }

    private Field getPrivateField(PrivateSample privateSample, String fieldName)
            throws NoSuchFieldException, SecurityException, IllegalArgumentException,
            IllegalAccessException {
        Class<?> clazz = privateSample.getClass();
        Field field = clazz.getDeclaredField(fieldName);
        field.setAccessible(true);
        return field;
    }

    private Object getUpdatedFinalFieldValue(PrivateSample privateSample, String newValue,
            String fieldName) throws NoSuchFieldException, SecurityException,
                    IllegalArgumentException, IllegalAccessException {
        Field finalField = getPrivateField(privateSample, fieldName);
        finalField.set(privateSample, newValue);
        return finalField.get(privateSample);
    }

    private Object getMethodValue(PrivateSample privateSample, String name)
            throws NoSuchMethodException, SecurityException, IllegalAccessException,
            IllegalArgumentException, InvocationTargetException {
        Method doIt = PrivateSample.class.getDeclaredMethod(name);
        doIt.setAccessible(true);
        return doIt.invoke(privateSample);
    }

    private Object getInnerClassMethod(PrivateSample parent, String classFullName,
            String methodName) throws ClassNotFoundException, NoSuchMethodException,
                    SecurityException, InstantiationException, IllegalAccessException,
                    IllegalArgumentException, InvocationTargetException {
        ClassLoader loader = ClassLoader.getSystemClassLoader();
        Class<?> innerClazz = loader.loadClass(classFullName);
        Constructor<?> constructor = innerClazz.getDeclaredConstructor(parent.getClass());
        constructor.setAccessible(true);
        Object innerObj = constructor.newInstance(parent);
        return innerClazz.getDeclaredMethod(methodName).invoke(innerObj);
    }
}

resolved.png Ich konnte es reparieren.

testStart.png Prüfung

testSucceeded.png Es ist fertig.

Recommended Posts

So testen Sie den privaten Bereich mit JUnit
[Java] So testen Sie, ob es in JUnit null ist
So testen Sie Interrupts während Thread.sleep mit JUnit
So testen Sie eine private Methode, die ein Array- oder Argument variabler Länge in JUnit verwendet
[Java] Testen Sie private Methoden mit JUnit
So filtern Sie den JUnit-Test in Gradle
Machen Sie einen Unit-Test mit Junit.
JUnit 5: Wie man Testfälle in enum schreibt
So schreiben Sie Testcode mit Basic-Zertifizierung
Testen Sie die Web-API mit junit
So führen Sie mit RxAndroid einen Komponententest mit JVM an einer Quelle durch
Verwendung von JUnit (Anfänger)
Wie man mit html.erb nummeriert (nummeriert)
So aktualisieren Sie mit activerecord-import
So führen Sie UT mit Excel als Testdaten mit Spring Boot + JUnit5 + DBUnit durch
Testen Sie private Methoden in JUnit
Wie schreibe ich Junit 5 organisiert
[Erstellen] Verwendung von JUnit
[Schienen] Verwendung von Scope
So führen Sie mit dem Rake-Test von gem nur bestimmte Dateien aus
So löschen Sie das Testbild, nachdem Sie den Rspec-Test mit CarrierWave ausgeführt haben
[Java] Ich möchte Standardeingabe und Standardausgabe mit JUnit testen
Verwendung des Bereichs (JSP & Servlet)
So führen Sie einen Komponententest für Spring AOP durch
Wie fange ich mit schlank an?
Wie man ein Zeichen mit "~" einschließt
Wie man mssql-tools mit alpine benutzt
Testen Sie den Spring Framework Controller mit Junit
So starten Sie Camunda mit Docker
So beschneiden Sie ein Bild in libGDX
So passen Sie TextPosition mit der iOS-Tastaturerweiterung an
So teilen Sie Dateien mit Docker Toolbox
So kompilieren Sie Java mit VsCode & Ant
[Java] Fassen Sie zusammen, wie Sie mit der Methode equals vergleichen können
[Android] Wie man mit dunklen Themen umgeht
Verwendung von BootStrap mit Play Framework
So wechseln Sie Miniaturbilder mit JavaScript
[Hinweis] Erste Schritte mit Rspec
API-basierte Steuerung mit cancancan
So beheben Sie das Systemdatum in JUnit
So erreichen Sie den Dateidownload mit Feign
So aktualisieren Sie verwandte Modelle mit accept_nested_attributes_for
So setzen Sie JAVA_HOME mit dem Appassembler-Maven-Plugin von Maven
So behandeln Sie Anmeldefehler mit devise
So löschen Sie Daten mit einem externen Schlüssel
Der JUnit 5-Gradle-Test führt zu einem Fehler mit der Lombok-Annotation
So überwachen Sie Nginx mit Docker-Compose mit Datadog
Einführung eines automatisierten Java-Tests mit JUnit 5 + Gradle
Der Umgang mit dem Vorkompilieren von Assets ist fehlgeschlagen.
[SpringBoot] So schreiben Sie einen Controller-Test
So erreichen Sie das Hochladen von Dateien mit Feign
So führen Sie Blazor (C #) mit Docker aus
So erstellen Sie eine Rails 6-Umgebung mit Docker