AKKA-Java NullPointerExeption

时间:2018-03-16 20:26:41

标签: java junit nullpointerexception akka

我通过跟随this guide移动AKKA的第一步:有一个J-unit测试文件和一个Actor类。你可以在链接上看到整个代码,它只是一堆行 但是,测试失败并且NullPointerException尝试构建新的TestKit,这是故障跟踪视图(Eclipse)中报告的错误:

java.lang.NullPointerException
at akka.actor.ExtensionId.apply(Extension.scala:77)
at akka.actor.ExtensionId.apply$(Extension.scala:77)
at akka.testkit.TestKitExtension$.apply(TestKitExtension.scala:11)
at akka.testkit.TestKitBase.$init$(TestKit.scala:145)
at akka.testkit.TestKit.<init>(TestKit.scala:828)
at akka.testkit.TestProbe.<init>(TestKit.scala:886)
at akka.testkit.TestProbe.<init>(TestKit.scala:888)
at akka.testkit.javadsl.TestKit.<init>(TestKit.scala:43)
at com.lightbend.akka.sample.DeviceTest.testReplyWithLatestTemperatureReading(DeviceTest.java:16)

这是关于什么的?

[编辑]

您链接的问题对于理解异常的含义很有用,但我仍然无法找到代码中的位置。 在这里,当junit调用new TestKit(system)失败时:

        package com.lightbend.akka.sample;

import static org.junit.Assert.assertEquals;
import java.util.Optional;
import org.junit.Test;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.testkit.javadsl.TestKit;

public class DeviceTest {

    static ActorSystem system;

    @Test
    public void testReplyWithLatestTemperatureReading() {

        TestKit probe = new TestKit(system);
        ActorRef deviceActor = system.actorOf(Device.props("group", "device"));

        deviceActor.tell(new Device.RecordTemperature(1L, 24.0), probe.getRef());
        assertEquals(1L, probe.expectMsgClass(Device.TemperatureRecorded.class).requestId);

        deviceActor.tell(new Device.ReadTemperature(2L), probe.getRef());
        Device.RespondTemperature response1 = probe.expectMsgClass(Device.RespondTemperature.class);
        assertEquals(2L, response1.requestId);
        assertEquals(Optional.of(24.0), response1.value);

        deviceActor.tell(new Device.RecordTemperature(3L, 55.0), probe.getRef());
        assertEquals(3L, probe.expectMsgClass(Device.TemperatureRecorded.class).requestId);

        deviceActor.tell(new Device.ReadTemperature(4L), probe.getRef());
        Device.RespondTemperature response2 = probe.expectMsgClass(Device.RespondTemperature.class);
        assertEquals(4L, response2.requestId);
        assertEquals(Optional.of(55.0), response2.value);
    }
}

这是完整的演员代码:

package com.lightbend.akka.sample;

import java.util.Optional;
import akka.actor.AbstractActor;
import akka.actor.Props;
import akka.event.Logging;
import akka.event.LoggingAdapter;

public class Device extends AbstractActor {

    private final LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this);
    final String groupId;
    final String deviceId;

    public Device(String groupId, String deviceId) {
        this.groupId = groupId;
        this.deviceId = deviceId;
    }

    public static Props props(String groupId, String deviceId) {
        return Props.create(Device.class, groupId, deviceId);
    }

    public static final class RecordTemperature {
        final long requestId;
        final double value;

        public RecordTemperature(long requestId, double value) {
            this.requestId = requestId;
            this.value = value;
        }
    }

    public static final class TemperatureRecorded {
        final long requestId;

        public TemperatureRecorded(long requestId) {
            this.requestId = requestId;
        }
    }

    public static final class ReadTemperature {
        final long requestId;

        public ReadTemperature(long requestId) {
            this.requestId = requestId;
        }
    }

    public static final class RespondTemperature {
        final long requestId;
        final Optional<Double> value;

        public RespondTemperature(long requestId, Optional<Double> value) {
            this.requestId = requestId;
            this.value = value;
        }
    }

    Optional<Double> lastTemperatureReading = Optional.empty();

    @Override
    public void preStart() {
        log.info("Device actor {}-{} started", groupId, deviceId);
    }

    @Override
    public void postStop() {
        log.info("Device actor {}-{} stopped", groupId, deviceId);
    }

    @Override
    public Receive createReceive() {
        return receiveBuilder()
                .match(RecordTemperature.class, r -> {
                    log.info("Recorded temperature reading {} with {}", r.value, r.requestId);
                    lastTemperatureReading = Optional.of(r.value);
                    getSender().tell(new TemperatureRecorded(r.requestId), getSelf());
                })
                .match(ReadTemperature.class, r -> {
                    getSender().tell(new RespondTemperature(r.requestId, lastTemperatureReading), getSelf());
                })
                .build();
    }
}

也许问题是system仍未初始化?我试图管理它,但我不会去任何地方。

0 个答案:

没有答案