2015-01-09 18 views
6

Tôi muốn theo dõi diễn viên diễn viên của mình, nhưng không thể đơn giản được tạo bằng từ khóa mới. Tôi đã tìm ra giải pháp sau:Làm gián điệp với mockito trên diễn viên Akka

val testActorSpy = spy(TestActorRef(new TestActor).underlyingActor) 
    val testActorRef = TestActorRef(testActorSpy) 

nhưng theo cách này tôi tạo một diễn viên không cần thiết. Có giải pháp sạch hơn nào không?

Trả lời

0

Vì vậy, sự hiểu biết của tôi về hệ thống diễn viên Akka là bạn nên làm điều này thông qua các thuộc tính sau đó phải không?

Vì vậy, hãy tạo diễn viên thông qua Đạo cụ và khi đang được kiểm tra, chỉ cần trả lại gián điệp cho diễn viên.

do đó điều này sẽ cung cấp cho bạn một kết quả:

val testActorRef = TestActorRef(spy(new TestActor)) 
val testActorSpy = testActorRef.underlyingActor 

Hãy nhận biết rằng underlyingActor bị phá hủy khi nam diễn viên này được khởi động lại. để chế nhạo điều này có thể không phải là lựa chọn tốt nhất.

Nếu sử dụng diễn viên trực tiếp thay vì đi qua hệ thống, bạn cũng có thể thử nghiệm mọi thứ và bỏ qua hệ thống cơ bản được nối luồng.

Xem this (dán mã bên dưới cho java).

static class MyActor extends UntypedActor { 
    public void onReceive(Object o) throws Exception { 
    if (o.equals("say42")) { 
     getSender().tell(42, getSelf()); 
    } else if (o instanceof Exception) { 
     throw (Exception) o; 
    } 
    } 
    public boolean testMe() { return true; } 
} 

@Test 
public void demonstrateTestActorRef() { 
    final Props props = Props.create(MyActor.class); 
    final TestActorRef<MyActor> ref = TestActorRef.create(system, props, "testA"); 
    final MyActor actor = ref.underlyingActor(); 
    assertTrue(actor.testMe()); 
} 
+0

Phương thức công khai duy nhất của diễn viên phải là 'onReceive'. Nếu không, bất biến có nguy cơ. Trong trường hợp này, nếu phương thức 'testMe' sửa đổi trạng thái của tác nhân, nguyên tắc đó bị vi phạm. 'testMe' có thể là riêng tư. Để truy cập các phương thức riêng trên các bài kiểm tra JUnit bằng Spring, sử dụng 'ReflectionTestUtils'. –

+0

Biến nó thành gói riêng tư. Có rất nhiều cách để sửa đổi khả năng hiển thị. Mọi người làm việc trên cơ sở mã của chúng tôi đều biết rằng trạng thái chia sẻ có thể thay đổi là xấu. Và ActorRef không trưng ra các chức năng công cộng. Vì vậy, nó không phải là một vấn đề. Các điều kiện chủng tộc của chúng tôi đã đến từ việc kết thúc tiểu bang tư nhân .. – Alex

+0

Bạn nói đúng. Các phương thức công khai bên trong một diễn viên không được hiển thị. Tôi chỉ có một cảm giác như nó là một mùi mã. Nhưng từ quan điểm chức năng, bạn đúng. Dù sao, trong trường hợp ai đó muốn giữ riêng phương thức của họ, hãy nhớ rằng họ có thể được gọi bằng 'ReflectionTestUtils' –

Các vấn đề liên quan