JUnit сынағы NullPointerException береді

Менің JUnit тестімнің біреуі маған NullPointerException береді және мен неге түсінбеймін. Бұл PacketWrapperTest сынақ класының мазмұны:

/**
 * Mock Node for Packet A.
 */
private Node nA;

/**
 * Packet A.
 */
private PacketWrapper packetA;

/**
 * Mock Node for Packet B.
 */
private Node nB;

/**
 * Packet B.
 */
private PacketWrapper packetB;

/**
 * Relationship A
 */
Relationship RelA;

/**
 * Relationship B
 */
Relationship RelB;

@Before
public void setup() {
    nA = mock(Node.class);
    nB = mock(Node.class);
    packetA = new PacketWrapper(nA);
    packetB = new PacketWrapper(nB);
    RelA = mock(Relationship.class);
    RelB = mock(Relationship.class);
}

@After
public void tearDown() {
    packetA = null;
    packetB = null;
}
/*
 * ---------------- Test hashContents() ---------------
 */
@Test
public void testHashContents() {//TODO: Fix
    when(nA.getProperty(PacketWrapper.KEY_CONTENTS)).thenReturn(new byte[] {1});
    packetA.hashContents();
    verify(nA).setProperty(PacketWrapper.KEY_CONTENTS, packetA.getContents().hashCode());
    verify(nA).setProperty(PacketWrapper.IS_HASH, true);
}

Бұл PacketWrapperTest-тың тиісті мазмұны:

/**
 * DB key for the contents property.
 */
static final String KEY_CONTENTS = "contents";

/**
 * DB key for the is_hashed property.
 */
static final String IS_HASH = "is_hashed";

/**
 * Underlying neo4j node.
 */
private final Node neo4jNode;

/**
 * Creates a new Packet wrapping the specified node
 * 
 * @param neo4jNode
 *            underlying neo4j node.
 */
public PacketWrapper(Node neo4jnode) {
    this.neo4jNode = neo4jnode;
}

@Override
public byte[] getContents() {
    return (byte []) neo4jNode.getProperty(KEY_CONTENTS);
}

@Override
public void setContents(byte[] newContents) {
    neo4jNode.setProperty(KEY_CONTENTS, newContents);
}

@Override
public void hashContents() {
    neo4jNode.setProperty(KEY_CONTENTS, ((byte[])getContents()).hashCode());
    neo4jNode.setProperty(IS_HASH, true);
}

@Override
public int hashCode() {
    return neo4jNode.hashCode();
}

Міне, стек іздері:

java.lang.NullPointerException
    at org.whispercomm.manes.server.graph.PacketWrapperTest.testHashContents(PacketWrapperTest.java:124)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Java қандай да бір себептермен маған бірнеше рет сканерлеуді бермегенімен, мен көшірген және қойған кезде, алғашқы екі жолды ғана көріп, қалғанын көрдім ...

EDIT: Өкінішке орай, желінің 124 дегенін ұмытып кетуіңізге болады

verify(nA).setProperty(PacketWrapper.KEY_CONTENTS, packetA.getContents().hashCode());

Сонымен қатар, neo4j кітапханаларын қолданамын.

EDIT2: Кейбір отладтау туралы мәлімдемелерді енгізгеннен кейін бұл тест код:

@Test
public void testHashContents() {//TODO: Fix
    byte[] testByte = new byte[] {1};
    when(nA.getProperty(PacketWrapper.KEY_CONTENTS)).thenReturn(testByte);
    packetA.hashContents();
    System.out.println(testByte.hashCode());
    System.out.println(packetA.getContents());
    System.out.println(packetA.getContents().hashCode());
    verify(nA, times(3)).setProperty(PacketWrapper.KEY_CONTENTS, packetA.getContents().hashCode());
    verify(nA).setProperty(PacketWrapper.IS_HASH, true);
}

Және бұл нәтиже:

26281671
[[email protected]
26281671

Желі:

verify(nA, times(3)).setProperty(PacketWrapper.KEY_CONTENTS, packetA.getContents().hashCode());

алып тастайды.

2
Кешіріңіз, желіні редакцияладым.
қосылды автор gsingh2011, көзі
Мен бұл туралы кешірім сұраймын. Егер мен осы мәселемен айналыса аламын, бірақ алмаймын. Сол жолда: тексеріңіз (nA, уақыт (3)) setProperty (PacketWrapper.KEY_CONTENTS, packetA.getContents ()) hashCode ()); NPE бар.
қосылды автор gsingh2011, көзі
soooo қандай желісі 124?
қосылды автор matt b, көзі
Сіз қосқан нәтиже арқылы NPE қандай жолды шығарады? бұл мәселені шешу өте қиын.
қосылды автор matt b, көзі
Сондықтан нөл бар? Бұл қандай жол? Мен адамнан /** Packet A */foo bar packetA; сияқты түсініктемелерді жек көремін, мен атынан айта аламын :(
қосылды автор Dave Newton, көзі

2 жауаптар

124-жолда олардың бірі болуы керек еді:

when(nA.getProperty(PacketWrapper.KEY_CONTENTS)).thenReturn(new byte[] {1});
packetA.getContents().hashCode()
verify(nA).setProperty(PacketWrapper.KEY_CONTENTS, packetA.getContents().hashCode());

Егер растау (nA) не болмаса (...) нөлді қайтарса, онда бұл жолдар NPE болады; егер KEY_CONTENTS сипаты анықталмаса, онда екінші NPE шығарады. Басқа жолдар жоғарыдан басқа әдістермен де стекке із қалдырады. Мұнда көрсетілгендей басқа кодтармен айналысуға болатын барлық нәрселер тым көп; мұны өзіңіз қадағалаңыз.

2
қосылды
PacketWrapper-да анықталған айнымалыларды қосуды ұмытып кеттім. Мен оларды қосып қойдым. Мұны ол екіталай емес етеді.
қосылды автор gsingh2011, көзі

Өтініште

verify(nA).setProperty(KEY_CONTENTS, packetA.getContents().hashCode());

setProperty деп аталатын алдында hashCode деген кодты nA (делегация арқылы) деп атайсыз. Тестіңізді өзгертіңіз

    @Test
public void testHashContents() {//TODO: Fix
    when(nA.getProperty(PacketWrapper.KEY_CONTENTS)).thenReturn(new byte[] {1});
    packetA.hashContents();
    int hash = packetA.getContents().hashCode();
    verify(nA).setProperty(PacketWrapper.KEY_CONTENTS, hash);
    verify(nA).setProperty(PacketWrapper.IS_HASH, true);
}

сіз оны көресіз.

1
қосылды
Кешіріңіз, бұл мәселені редакцияларда анық түсіндірдім. Сынақтың сәтсіздігі фактісі сынып сынақтан өтуге тұрарлық дегенді білдіреді. Әрине, мәселе менің тестімде.
қосылды автор gsingh2011, көзі
Менің лауазымыма EDIT2 қарау. packetA.getContents() нөлді қайтармайды.
қосылды автор gsingh2011, көзі
Рақмет сізге! Ол әлі күнге дейін неге шатастырылып жатса да жұмыс істейді. Неліктен әдіс тексерілгеніне байланысты mockito шатастыруға болады? SetProperty() параметрі анық емес пе?
қосылды автор gsingh2011, көзі
Менің ойымша, бұл сіздің тестіңіз сәтсіз. PacketA.getContents() нөлді қайтаратындығын тексеріңіз.
қосылды автор Garrett Hall, көзі
Жарайды, мен оны түсіндім. Бұл қатал болды.
қосылды автор Garrett Hall, көзі
Жоқ, тексеріңіз - бұл әшкерелеуге арналған келесі әдіс деп аталып отырғандығын тексеруге болатындығын көрсететін статикалық әдіс.
қосылды автор Garrett Hall, көзі