Тест JUnit, дающий исключение NullPointerException - PullRequest
0 голосов
/ 28 октября 2011

Один из моих тестов 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 не дала мне такой длинной трассировки стека, у меня были только первые две строки, а остальные я видел, когда копировал и вставлял ...

РЕДАКТИРОВАТЬ: Извините, забылупомянуть, что строка 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
[B@19106c7
26281671

Строка:

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

вызывает исключение.

Ответы [ 2 ]

2 голосов
/ 28 октября 2011

Строка 124 должна быть одной из них:

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

Если verify (nA) или когда (...) возвращает null, то эти строки будут NPE; если свойство KEY_CONTENTS не определено, то второй бросит NPE. Другие строки дают трассировку стека с другими методами сверху. Есть слишком много разных способов, где эти вещи могут пойти не так, все это связано с другим кодом, не показанным здесь; вам придется выследить это самостоятельно.

1 голос
/ 28 октября 2011

В заявлении

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

вы на самом деле вызываете hashCode на nA (через делегирование), прежде чем вызывать setProperty, что сбивает с толку Mockito относительно того, какой метод проверяется. Измените свой тест на

    @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);
}

и вы увидите, что оно проходит.

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